在Android中发送和解析JSON对象

时间:2010-05-12 12:24:57

标签: android json parsing

我想以JSON对象的形式向服务器发送消息,并从服务器解析JSON响应。

JSON对象的示例

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

我试图通过逐个属性来手动解析JSON。我可以使用任何库/实用程序来简化此过程吗?

11 个答案:

答案 0 :(得分:118)

我很惊讶这些没有被提及:但是使用json.org的小包装而不是使用简单的手动过程,GSon和Jackson使用起来更方便。所以:

因此,您实际上可以绑定到您自己的POJO,而不是一些半assed树节点或列表和地图。 (并且至少杰克逊允许绑定到这样的东西(也许是GSON,也不确定),JsonNode,Map,List,如果你真的想要这些而不是'真正的'对象)

2014年3月19日编辑:

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

答案 1 :(得分:85)

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

答案 2 :(得分:30)

如果数据具有明确的结构,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 class的代码

package com.tut.JSON;

public class Post {

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

答案 3 :(得分:4)

这是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;

    }

注意:sdk 23不再支持DefaultHttpClient,因此建议使用带有此代码的目标sdk 21。

答案 4 :(得分:3)

JSON没什么。圆括号用于“对象”(关联数组),方括号用于没有键的数组(数字索引)。至于在Android中使用它,有一些现成的类包含在sdk中(不需要下载)。

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

答案 5 :(得分:2)

其他答案已经注意到Jackson和GSON-- Android上流行的附加JSON库,以及json.org,这是Android中包含的简单JSON包。

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

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

这包括
- android.util.JsonReader:docssource
- android.util.JsonWriter:docssource

我还将添加一个额外的考虑因素,将我推回到Jackson和GSON:我发现使用第三方库而不是android。*包很有用,因为我编写的代码可以在客户端和服务器之间共享。这对于像JSON这样的东西尤其重要,在这种情况下,您可能希望在一端将数据序列化为JSON以发送到另一端。对于这样的用例,如果你在两端都使用Java,那么有助于避免引入android。*依赖。

或者我想可以抓住相关的android。*源代码并将其添加到您的服务器项目中,但我还没试过......

答案 6 :(得分:1)

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

答案 7 :(得分:1)

你只需要导入这个

   import org.json.JSONObject;


  constructing the String that you want to send

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

我正在使用两个对象,因为你可以在另一个

中有一个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());

我用它在logcat中看到我发送的内容

        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;
}

答案 8 :(得分:0)

如果您正在寻找Android中的快速json解析,那么我建议您使用免费提供的工具。

JSON Class Creator tool

它可以免费使用,它会在一两秒内创建你的所有json解析类..:D

答案 9 :(得分:0)

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

bar

此功能使其成为我个人的最爱。

答案 10 :(得分:0)

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

org.json: - 如果您想读取或写入json,那么您可以使用此库。 首先创建JsonObject: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

现在,使用此对象获取您的值: -

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

您可以看到完整的示例here

Jackson databind: - 如果你想绑定和解析你的json到特定的POJO类,那么你可以使用jackson-databind库,这会将你的json绑定到POJO类: -

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

您可以看到完整的示例here