我要解析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个字段的最小值。
答案 0 :(得分:3)
您可以使用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");
}
答案 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。
答案 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
}