2016-07-15 94 views
0

我得到它具有以下結構的JSON:GSON反序列化與不斷變化的字段類型

{"field1": "string", 
"field2": false, 
"a": { 
    "b": { 
     "listString": [] 
    }, 
    "c": { 
     "listString": [], 
     "s": "string" 
    }, 
    "parent": { 
     "childA": { 
      "listString": ["string", "string"] 
     }, 
     "s": "string" 
    }, 
    "parent2": { 
     "listString": ["string", "string"], 
     "s": "string" 
    } 
}, 
"field3": ["s", "s"] 
} 

我現在面臨的問題與parent(和parent2),因爲這些字段的格式可以改變。雖然複雜對象bc的格式保持不變。例如,我可以得到parent(同樣適用於parent2)以這樣的方式

{"parent": { 
    "childA":{ 
     "listString": ["ssssa", "a"] 
     }, 
    "s": "string" 
}} 

{"parent": { 
    "listString": ["ssssa", "a"], 
    "s": "string" 
}} 

此外,childA場(如果存在的話)可以有不同的名稱,也可以是childBchildC

我創建了複雜對象的Java類:

public class MyPojo{ 
    private String[] field1; 
    private String field2; 
    private A a; 
    private String field3;...} 

public class A{ 
    private B b; 
    private C c; 
    private Parent parent; 
    private Parent2 parent2;..} 

public class Parent{ 
    private String s; 
    private ChildA childA;...}... 

如果parentparent2對象具有不同的合成器,我該如何使用Gson反序列化此類東西?

+0

是childA,childB和childC是唯一的選擇?或者它可以是帶有孩子*前綴的任何東西?例如childXX? – gybandi

+0

更準確地說,childA,childB和childC(如果存在)應該是AND,OR或NOT。這些是唯一可能發生的項目名稱。 – choka

回答

0

這是父類:

public class Parent { 
Map<String, JsonElement> parent = null; 

public Map<String, JsonElement> getParent() { 
    return parent; 
} 

public void setParent(Map<String, JsonElement> parent) { 
    this.parent = parent; 
} 

} 

這是主類:

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    String input = "{\"parent\": {\"s\": \"string\",\"childA\":{\"listString\": [\"ssssa\", \"a\"]}}}"; 
    Gson gsonInstance = null; 

    gsonInstance = new GsonBuilder().create(); 

    Parent p = gsonInstance.fromJson(input, Parent.class); 

    Map<String, JsonElement> parentMap = p.getParent(); 
    Set<String> keyMap = parentMap.keySet(); 

    Iterator<String> iter = keyMap.iterator(); 
    while(iter.hasNext()){ 
     String name = iter.next(); 
     if(name.matches("child(.*)")){ 
      System.out.println(parentMap.get(name)); 
      // do your logic 
     } 
     if (keyMap.contains("listString")){ 
      List<String> listString = getListString(parentMap.get("listString")); 
      System.out.println(listString.toString()); 
     } 
    } 

} 

public static List<String> getListString(JsonElement list){ 
    Type listType = new TypeToken<List<String>>() {}.getType(); 
    List<String> listString = new Gson().fromJson(list, listType); 
    return listString; 
} 

希望它能幫助!

+0

謝謝!它對這個例子有幫助和效果很好! 但是,我的JSON更復雜,** parent **字段只是其中的一部分。是否有可能創建一個自定義的反序列化器,它將基於映射中的值(所以(「childA」對象和「s」字符串)或(「listString」數組和「s」字符串)),將所有屬性到適當的父Java Java對象**? – choka

+0

我想你應該在問題中提到它。如果你需要一些更復雜的類的答案,你可能會在這裏提到一個類似的問題:http://stackoverflow.com/questions/38226024/gson-with-several-known-classes/38321215#38321215 –

+0

謝謝!我相應地更新了我的問題。 – choka