哪种解析Android中的JSON数据最好?

时间:2014-03-11 12:45:51

标签: android json parsing gson

我要解析JSON数据。结构不是固定的,有时它作为单个字符串出现,有时作为数组出现。

目前,我们正在使用GSON库来解析JSON,但是当它作为一个数组出现时会遇到问题。

例如:

1.  {"msg":"data","c":300,"stat":"k"}


2. {
    "msg": [
        " {\"id\":2,\"to\":\"83662\",\"from\":\"199878\",\"msg\":\"llll\",\"c\":200,\"ts\":1394536776}"
     ],
     "c": 200,
     "stat": "k",
     "_ts": 1394536776
 }

在上面的示例中,有时我将msg作为字符串,有时作为数组。

任何人都可以帮助我吗?如果我决定使用JSON解析,那将非常繁琐,因为我有大约20多个要解析的API,每个API包含50个字段的最小值。

4 个答案:

答案 0 :(得分:3)

您可以使用JSONObjectJSONArray类代替GSON来处理JSON数据

第一个例子

String jsonStr = "{\"msg\":\"data\",\"c\":300,\"stat\":\"k\"}";

JSONObject jsonObj = new JSONObject(jsonStr);

String msg = jsonObj.getString("msg");
Integer c = jsonObj.getInteger("c");
String stat = jsonObj.getString("stat");

对于第二个例子

   String jsonStr = ... // "your JSON data";

   JSONObject jsonObj = new JSONObject(jsonStr);

   JSONArray jsonArr = jsonObj.getJSONArray("msg");

   JSONObject arrItem = jsonArr.getJSONObject(0);

   //and so on

JSONObject类还有方法opString,opArray,如果你想要获取的数据不存在或类型错误,它不会抛出异常

例如

JSONArray arr = jsonObj.optJSONArray("msg");
JSONObject msg = null;
if (arr != null) {
    msg = arr.getJSONObject(0)
} else {
   msg = jsonObj.getJSONObject("msg");
}

答案 1 :(得分:0)

您可以使用Google GSON lib直接将json解析为类对象。这很容易也很准确。如果代码是300就直接解析没有GSON的json对象,那么时间代码就不同了。如果代码是200,则使用GSON(定义类似的java类)

String c= json.getString("c");
if(c.equals("300")
String message = status.getString("msg");

答案 2 :(得分:0)

有两种方法可以实现JSON。

  1. 手动使用Android OS JSON Parser Android JSON Parsing And Conversion
  2. 使用GSON Library [Library](https://code.google.com/p/google-gson/downloads/list)。如果你知道json响应的所有参数和模型,这很容易处理。

答案 3 :(得分:0)

请参阅下面的代码段,使用Google Gson库对您的json进行反序列化,无例外。

String jsonStr = "your json string ";

Gson gson = new Gson();
JsonObject jsonObj = gson.fromJson (jsonStr, JsonElement.class).getAsJsonObject();

JsonElement elem = jsonObj.get("msg");

if(elem.isJsonArray()) { //**Array**
   ArrayList<MyMessage> msgList = gson.fromJson(elem.toString(), new TypeToken<List<MyMessage>>(){}.getType());
} else if(elem.isJsonObject()) { //**Object**
   Note note = gson.fromJson(elem.toString(), MyMessage.class);
} else {  //**String**
   String note = elem.toString();
}

MyMessage类

public class MyMessage {
   String to;
   String from;
   String msg;
   int id;
   int c;
   long ts;

   // Setters and Getters
}