GSON创建一个对象数组

时间:2014-11-07 02:38:23

标签: java json gson patch

我正在尝试创建格式的patchRequest:

'[
{
    "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(这会失败)。

找不到任何对我的案例有帮助的文档。谁能向我提出同样的建议。

感谢。

2 个答案:

答案 0 :(得分:2)

在伪代码中:

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 :(得分:0)

我猜,逻辑是;

  1. 如果只有一个值,value json标签应该是基元 串。
  2. 如果有多个值,value json标记必须是     具有name个字段的对象数组。
  3. 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的更多信息。