[英]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();
我猜想,邏輯是;
value
json標簽應為原始字符串。 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.