在Android中发送和解析JSON对象

Pri*_*han 137 parsing android json

我想以JSON对象的形式将消息发送到服务器并解析来自服务器的JSON响应.

JSON对象的示例

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*Man 118

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

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

编辑2014年3月19日:

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

  • GSON +1.我们在Android应用中特别使用了GSON的流媒体支持http://sites.google.com/site/gson/streaming. (10认同)
  • 同样为GSON流媒体+1.最初实现了Jackson流,但是虽然在调试版中有功能,但ProGuard产生了大量错误并且发布版本导致崩溃,这些崩溃很难被追踪.我确信这不是杰克逊相关的问题,但它让我切换到GSON,它运行良好,只需要额外的14kB流媒体. (2认同)

Val*_*lev 85

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


Pri*_*han 31

如果数据具有明确的结构,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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

邮政课程代码

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

完整解决方案

  • 为了它的价值,可以简化代码:不需要JSONObject转换.GSon可选择setter和getter; 可以添加,如果有人想要,但不是绝对必要的. (4认同)
  • 只是为了澄清StaxMan的评论.您的示例是使用jString,将其转换为JSONObject,然后将其转换回String以供gson读取.只需使用pst = gson.fromJson(jString,Post.class).我相信这也将摆脱try-catch的需要.正如StaxMan所指出的那样,Post.class中的setter和getter没有增加任何价值.其他人纠正你的例子会很有帮助. (4认同)