如何使用gson解析json?我有一个包含多个对象类型的json数组,我不知道,我需要创建哪种对象来保存这个结构.我无法更改json数据格式(我不控制服务器).
我可以使用gson或其他库解析这个json数组,我该怎么办?
这是json代码块:
[
{
"type": 1,
"object": {
"title1": "title1",
"title2": "title2"
}
},
{
"type": 2,
"object": [
"string",
"string",
"string"
]
},
{
"type": 3,
"object": [
{
"url": "url",
"text": "text",
"width": 600,
"height": 600
},
{
"url": "url",
"text": "text",
"width": 600,
"height": 600
}
]
},
{
"type": 4,
"object": {
"id": 337203,
"type": 1,
"city": "1"
}
}
]
解决方法:
这种json结构固有地对gson不友好.即你无法在java中干净地建模,因为“对象”键指的是动态类型.你可以用这个结构做的最好的模型是这样的:
public class Models extends ArrayList<Models.Container> {
public class Container {
public int type;
public Object object;
}
public class Type1Object {
public String title1;
public String title2;
}
public class Type3Object {
public String url;
public String text;
public int width;
public int height;
}
public class Type4Object {
public int id;
public int type;
public int city;
}
}
然后在类型和对象字段上做一些尴尬的开关:
String json = "{ ... json string ... }";
Gson gson = new Gson();
Models model = gson.fromJson(json, Models.class);
for (Models.Container container : model) {
String innerJson = gson.toJson(container.object);
switch(container.type){
case 1:
Models.Type1Object type1Object = gson.fromJson(innerJson, Models.Type1Object.class);
// do something with type 1 object...
break;
case 2:
String[] type2Object = gson.fromJson(innerJson, String[].class);
// do something with type 2 object...
break;
case 3:
Models.Type3Object[] type3Object = gson.fromJson(innerJson, Models.Type3Object[].class);
// do something with type 3 object...
break;
case 4:
Models.Type4Object type4Object = gson.fromJson(innerJson, Models.Type4Object.class);
// do something with type 4 object...
break;
}
}
最终,最好的解决方案是将json结构更改为与java更兼容的东西.
例如:
[
{
"type": 1,
"type1Object": {
"title1": "title1",
"title2": "title2"
}
},
{
"type": 2,
"type2Object": [
"string",
"string",
"string"
]
},
{
"type": 3,
"type3Object": [
{
"url": "url",
"text": "text",
"width": 600,
"height": 600
},
{
"url": "url",
"text": "text",
"width": 600,
"height": 600
}
]
},
{
"type": 4,
"type4Object": {
"id": 337203,
"type": 1,
"city": "1"
}
}
]