2016-07-15 120 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