我有以下Item类:
public class Item {
public Object item;
}
我正在使用GSON将JSON插入此对象。
tmp =
{
"_id": {
"$oid": "5076371389d22e8906000000"
},
"item": {
"values": [
{
"value1": [
4958,
3787,
344
],
"value2": [
4,
13,
23
]
}
],
"name": "item1"
}
}
Java位:
Item item = new Item();
Gson g = new Gson();
it = g.fromJson(tmp.toString(), Item.class);
it.item
变为StringMap
类型(http://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/internal/StringMap.java?r=1131)
我现在需要访问此对象中的子对象。
我可以使用此类型的重写toString
函数来打印此对象中的所有对象。但是我怎么能够通过它?
附:我将所有内容放入对象数据类型而不是结构化类的原因是JSON结构每次都有所不同,所以我不能真正拥有类模式。
有什么建议吗?
答案 0 :(得分:2)
您应该创建一个反映JSON的对象结构(因为这是您尝试做的事情)。对于您的示例,您可以使用此:
public class MyObject {
private Item item;
private String _id;
// getters, setters, etc.
}
public class Item {
private List<Value> values;
private String name;
// getters, setters, etc.
}
public class Value {
private List<Integer> values1;
private List<Integer> values2;
// getters, setters, etc.
}
然后将MyObject.class
传递给Gson:
MyObject myObj = g.fromJson(tmp.toString(), MyObject.class);
您可以像values
一样获取列表:
List<Integer> values1 = myObj.getItem().getValues().get(0).getValues1();
List<Integer> values2 = myObj.getItem().getValues().get(0).getValues2();
试一试,看看它是否有效。
此外,您应该查看我对类似问题here的回答,特别是关于如何根据某些JSON对象为Gson编写对象结构的最后部分。
答案 1 :(得分:0)
您始终可以为使用反射的自定义对象创建构造函数并获取StringMap
public MyObject(StringMap sm){
Iterator it = sm.entrySet().iterator();
while(it.hasNext()){
Entry pairs = (Entry)it.next();
Class<?> c = this.getClass();
try {
Field value = c.getDeclaredField((String) pairs.getKey());
value.set(this, pairs.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}