我有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
}