2014-11-07 136 views
0

我試圖創建格式的patchRequest數組:GSON創建對象

'[ 
{ 
    "op": "replace", 
    "path": "/path1", 
    "value": "val1" 
}, 
{ 
    "op": "replace", 
    "path": "/path2", 
    "value": [ 
     { 
      "name": "val2" 
     } 
    ] 
} 
]' 

我已經嘗試了很多愚蠢的事情,比如創建2個JSON對象,並試圖將它們添加到patchRequest對象。或者嘗試創建2個patchRequestObj,然後將它們添加到patchRequest List(由於我使用patchRequest作爲我的輸入,所以失敗了目的)。將patchReq對象添加到JsonObjects,添加到JSONArray並轉換回patchRequest(失敗)。

找不到有助於我的案例的任何文檔。任何人都可以向我提出同樣的建議。

謝謝。

+0

你可以使用POJO類型?只需創建一個'Patch []'或一個'List '並將其序列化即可。 – 2014-11-07 02:40:02

+0

這是一個包含兩個地圖的列表。其中一個地圖包含一個元素,該元素是一個List,其中包含一個僅包含一個元素的Map。 – 2014-11-07 02:40:26

回答

0

據我猜測,邏輯是;

  1. 如果只有一個值,value JSON標籤應該是一種原始的 字符串。
  2. 如果存在多個值,value json標記必須是 具有name字段的對象數組。

enter image description here

對於這種情況,你可以寫一個自定義TypeAdapter

public class ValueTypeAdapter extends TypeAdapter<Value> { 

    @Override 
    public Value read(JsonReader in) throws IOException { 
     Value value = null; 

     JsonParser jsonParser = new JsonParser(); 
     JsonElement je = jsonParser.parse(in); 

     if(je instanceof JsonPrimitive) { 
      value = new Value(); 
      value.nameArr = new String[1]; 
      value.nameArr[0] = ((JsonPrimitive)je).getAsString(); 
     } else if (je instanceof JsonArray) { 
      JsonArray jsonArr = (JsonArray)je; 
      value = new Value(); 
      value.nameArr = new String[jsonArr.size()]; 
      for (int i = 0; i < jsonArr.size(); i++) { 
       JsonObject jo = (JsonObject)jsonArr.get(i); 
       value.nameArr[i] = jo.get("name").getAsString(); 
      } 
     } 

     return value; 
    } 

    @Override 
    public void write(JsonWriter out, Value value) throws IOException { 
     if (value != null) { 
      if (value.nameArr != null && value.nameArr.length > 0) { 
       if (value.nameArr.length == 1) { 
        out.value(value.nameArr[0]); 
       } else if (value.nameArr.length > 1) { 
        out.beginArray(); 
        for (String nameVal : value.nameArr) { 
         out.beginObject(); 
         out.name("name").value(nameVal); 
         out.endObject(); 
        } 
        out.endArray(); 
       } 
      } 
     } 
    }  
} 

你的POJO:

public class Item { 
    private String op; 
    private String path; 
    private Value value; 

    // TODO: Add Getters/Setters 
} 

public class Value { 
    private String[] nameArr; 

    // TODO: Add Getters/Setters 
} 

測試:

注意:我使用了類似的json字符串。差異是第二個數組項包含2個值。在這個測試中,你會看到反序列化將被完成並且itemArr將被正確填充。在將itemArr序列化爲json字符串之後,您會看到結果與傳入的測試json字符串值相同。

String json = "[{\"op\":\"replace\",\"path\":\"/path1\",\"value\":\"val1\"},{\"op\":\"replace\",\"path\":\"/path2\",\"value\":[{\"name\":\"val2\"},{\"name\":\"val3\"}]}]"; 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Value.class, new ValueTypeAdapter()); 
    Gson gson = gsonBuilder.create(); 

    Item[] itemArr = gson.fromJson(json, Item[].class); 

    String serialized = gson.toJson(itemArr); 

    System.out.println("serialized:" + serialized); 
    // NOTE: serialized output is same with incoming test value 

您可以從this site瞭解更多關於TypeAdapters的信息。

0

僞代碼:

mainArray = new JsonArray(); 
firstObject = new JsonObject(); 
firstObject.add("op", "replace"); 
firstObject.add("path", "/path1"); 
firstObject.add("value", "val1"); 
mainArray.add(firstObject); 
secondObject = new JsonObject(); 
secondObject.add("op", "replace"); 
secondObject.add("path", "/path2"); 
innerArray = new JsonArray(); 
innerObject = new JsonObject(); 
innerObject.add("name", "val2"); 
innerArray.add(innerObject); 
secondObject.add("value", innerArray); 
mainArray.add(secondObject); 
jsonString = mainArray.toJsonString();