2012-10-11 43 views
2

我有以下的项目类:的Java序列化GSON成JSON对象

public class Item { 
    public Object item; 
} 

我插入一个JSON到使用GSON此对象。

TMP =

{ 
    "_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这个类型的函数打印这个对象中的所有对象。但是,我将如何能够浏览它? P.S.我将所有东西放入对象数据类型而不是结构化类的原因在于JSON结构每次都有所不同,所以我实际上不能拥有类架构。 有什么建议吗?

回答

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编写对象结构的部分。

+0

阿自定义对象的构造,我没有看到你的问题的结束,对不起。 JSON结构有多大? – Brian

+0

它是从非结构化数据集生成的。唯一保持不变的是Item对象。 – Reza

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