这是解析Android中不同格式JSON数据的最佳方式



我有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个字段。

你可以使用JSONObject和JSONArray类来代替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");
}

您可以使用Google GSON库直接解析json到类对象。这既简单又准确。两个时间代码都不一样,如果代码是300直接解析json对象,不用GSON。如果代码是200,则使用GSON(定义类似的java类)

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

参考下面的代码片段,使用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
}

最新更新