2

我有以下项目类:

public class Item {
    public Object item;
}

我正在使用 GSON 将 JSON 插入此对象。

时间=

{
    "_id": {
        "$oid": "5076371389d22e8906000000"
    },
    "item": {
        "values": [
            {
                "value1": [
                    4958,
                    3787,
                    344
                ],
                "value2": [
                    4,
                    13,
                    23
                ]
            }
        ], 
        "name": "item1"
    }
}

爪哇位:

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函数,它打印这个对象中的所有对象。但是我如何才能浏览它呢?PS我将所有内容都放入对象数据类型而不是结构化类的原因是JSON结构每次都在变化,所以我不能真正拥有类模式。有什么建议么?

4

2 回答 2

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();

试试看它是否有效。

另外,您应该在这里查看我对类似问题的回答,特别是最后关于如何基于一些 JSON 对象为 Gson 编写对象结构的部分。

于 2012-10-11T21:19:46.283 回答
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();
        }
    }
}
于 2013-04-16T18:45:23.707 回答