在 Android 中发送和解析 JSON 对象

我希望以 JSON 对象的形式向服务器发送消息,并解析来自服务器的 JSON 响应。

JSON 对象示例

{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time":  "current time"
}
}

我试图通过逐个属性进行属性分析来手动解析 JSON。是否有任何库/实用程序我可以使用这个过程更容易?

161922 次浏览

您可以从 http://json.org(JSON-lib 或 org.JSON)下载一个库,并使用它来解析/生成 JSON

对于 JSON 来说,没有什么真正意义上的东西。花括号表示“对象”(关联数组) ,方括号表示没有键(数字索引)的数组。至于在 Android 中使用它,sdk 中包含了现成的类(不需要下载)。

看看这些课程: Http://developer.android.com/reference/org/json/package-summary.html

您可以使用 JSONObjectOrg.json JSONTokener。您不需要任何外部库,因为这些类是 Android SDK 附带的

我很惊讶这些没有被提及: 但是在 json.org 的小软件包中,GSon 和 Jackson 使用起来要方便得多,而不是仅仅使用简单的手工处理。所以:

因此,您实际上可以绑定到您自己的 POJO,而不是一些半吊子的树节点或 List 和 Maps。 (至少 Jackson 也允许绑定到这些东西(可能还有 GSON,不确定)、 JsonNode、 Map、 List,如果你真的想要这些而不是“真正的”对象的话)

2014年3月19日编辑:

另一个新的竞争者是 小杰克逊库: 它使用与 Jackson (jackson-core)相同的快速流解析器/生成器,但数据绑定部分很小(50kB)。功能性更有限(没有注释,只有普通的 JavaBean) ,但是性能方面应该更快,初始化(第一次调用)开销也非常低。 所以它可能是个不错的选择,尤其是对于小型应用程序。

如果数据有一个明确的结构,GSON 是最容易使用的,也是最好的方法。

下载 Gson

将其添加到引用的库中。

package com.tut.JSON;


import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;


public class SimpleJson extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";




GsonBuilder gsonb = new GsonBuilder();
Gson gson = gsonb.create();
Post pst;


try {
pst = gson.fromJson(jString,  Post.class);


} catch (JSONException e) {
e.printStackTrace();
}
}
}

Post 类的代码

package com.tut.JSON;


public class Post {


String message;
String time;
String username;
Bitmap icon;
}

这是 JsonParser 类

public class JSONParser {


static InputStream is = null;
static JSONObject jObj = null;
static String json = "";


// constructor
public JSONParser() {


}


public JSONObject getJSONFromUrl(String url) {


// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);


HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();


} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}


// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}


// return JSON String
return jObj;


}

注意: sdk23不再支持 DefaultHttpClient,因此建议将目标 sdk21与此代码一起使用。

其他的答案已经注意到了 Jackson 和 GSON —— Android 上流行的附加 JSON 库,以及 JSON.org,Android 中包含的基本 JSON 包。

但是我认为值得注意的是 Android 现在有了自己的全功能 JSON API。

这是在 Honeycomb: API 级别11中添加的。

这包括
JsonReader: 医生,and < a href = “ https://android.googlesource.com/Platform/Framework/base/+/refs/head/master/core/java/android/util/JsonReader.java”rel = “ nofollow”> source
JsonWriter: 医生,and < a href = “ https://android.googlesource.com/Platform/Framework/base/+/refs/head/master/core/java/android/util/JsonWriter.java”rel = “ nofollow”> source

我还将添加一个额外的考虑,将我推回到 Jackson 和 GSON: 我发现使用第三方库比使用 android 更有用。* 包,因为这样我写的代码可以在客户端和服务器之间共享。这与 JSON 之类的东西特别相关,您可能希望将数据序列化到 JSON 的一端,以便发送到另一端。对于这样的用例,如果两端都使用 Java,就可以避免引入 android。依赖 * 。

或者我想可以抓住相关的机器人。* 源代码,并添加到您的服务器项目,但我还没有尝试..。

如果你正在寻找快速 json 解析在 android 比我建议你一个工具,这是免费提供。

类创建工具

它可以免费使用,并且可以在一两秒内创建 all json 解析类. . : D

虽然已经有很好的答案提供给用户,如鼓励使用 GSON 等。我想建议使用 Org.json。它包括大多数 GSON 功能。它还允许您将 json 字符串作为参数传递给它的 JSONObject,它将处理 rest 例如:

JSONObject json = new JSONObject("some random json string");

这个功能使它成为我个人的最爱。

你只需要导入这个

   import org.json.JSONObject;




constructing the String that you want to send


JSONObject param=new JSONObject();
JSONObject post=new JSONObject();

IM 使用两个对象,因为您可以在另一个对象中包含一个 jsonObject

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

然后我把 Json 柱放在另一个里面,就像这样

  param.put("post",post);

这是我用来提出请求的方法

 makeRequest(param.toString());


public JSONObject makeRequest(String param)
{
try
{

设置连接

        urlConnection = new URL("your url");
connection = (HttpURLConnection) urlConnection.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
connection.setReadTimeout(60000);
connection.setConnectTimeout(60000);
connection.connect();

设置输出流

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

我用这个在日志中看到我发送什么

        Log.d("OUTPUT STREAM  " ,param);
dataOutputStream.writeBytes(param);
dataOutputStream.flush();
dataOutputStream.close();


InputStream in = new BufferedInputStream(connection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
result = new StringBuilder();
String line;

这里构造了字符串

        while ((line = reader.readLine()) != null)
{
result.append(line);
}

我使用这个日志来看看它在响应中发生了什么

         Log.d("INPUTSTREAM: ",result.toString());

使用包含服务器响应的 String 实例化 json

        jResponse=new JSONObject(result.toString());


}
catch (IOException e) {
e.printStackTrace();
return jResponse=null;
} catch (JSONException e)
{
e.printStackTrace();
return jResponse=null;
}
connection.disconnect();
return jResponse;
}

有不同的开放源码库,您可以使用它们来解析 json。

如果你想读写 json,你可以使用这个库。 首先创建 JsonObject:-

JSONObject jsonObj = new JSONObject(<jsonStr>);

现在,使用这个对象来获取您的值:-

String id = jsonObj.getString("id");

您可以看到完整的例子 给你

Jackson database ind:- 如果您想绑定并解析您的 json 到特定的 POJO 类,那么您可以使用 Jackson-database ind 库,这将把您的 json 绑定到 POJO 类:-

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

您可以看到完整的例子 给你