2012-10-11 89 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(); 
     } 
    } 
}