Java Gson将json序列化为一个对象

时间:2012-10-11 20:39:01

标签: java json gson

我有以下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结构每次都有所不同,所以我不能真正拥有类模式。 有什么建议吗?

2 个答案:

答案 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();
        }
    }
}