簡體   English   中英

GSON創建對象數組

[英]GSON creating an Array of Objects

我正在嘗試創建以下格式的patchRequest:

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

我嘗試了很多愚蠢的事情,例如創建2個json對象並將其添加到patchRequest對象。 或嘗試創建2個patchRequestObj,然后將它們添加到patchRequest列表中(由於我使用patchRequest作為輸入,因此無法達到目的)。 將patchReq對象添加到JsonObjects,添加到JSONArray並轉換回patchRequest(此操作失敗)。

找不到對我的情況有用的任何文檔。 誰能向我建議相同。

謝謝。

用偽代碼:

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();

我猜想,邏輯是;

  1. 如果只有一個值,則value json標簽應為原始字符串。
  2. 如果有多個值,則value json標簽必須是具有name字段的對象的數組。

在此處輸入圖片說明

對於這種情況,您可以編寫一個自定義的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字符串之后,您itemArr看到結果與傳入的測試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

您可以從該站點閱讀有關TypeAdapters的更多信息。

暫無
暫無

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

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