簡體   English   中英

不斷變化的字段類型的Gson反序列化

[英]Gson deserialization with changing field types

我得到一個具有以下結構的JSON:

{"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反序列化此類內容?

這是父類:

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

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM