Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GSON创建对象数组_Java_Json_Gson_Patch - Fatal编程技术网

Java GSON创建对象数组

Java GSON创建对象数组,java,json,gson,patch,Java,Json,Gson,Patch,我正在尝试创建以下格式的修补请求: '[ { "op": "replace", "path": "/path1", "value": "val1" }, { "op": "replace", "path": "/path2", "value": [ { "name": "val2" } ] } ]' 我尝试过很多愚蠢的事情,比如创建2个json对象并尝试将它们添加到patchRequ

我正在尝试创建以下格式的修补请求:

'[
{
    "op": "replace",
    "path": "/path1",
    "value": "val1"
},
{
    "op": "replace",
    "path": "/path2",
    "value": [
        {
            "name": "val2"
        }
    ]
}
]'
我尝试过很多愚蠢的事情,比如创建2个json对象并尝试将它们添加到patchRequest对象。或者尝试创建2个patchRequestObj,然后将它们添加到patchRequest列表中(因为我使用patchRequest作为输入,所以这无法达到目的)。patchReq对象到JSONObject,添加到JSONArray并转换回patchRequest(这将失败)

找不到任何有助于我的案例的文档。有人能给我提出同样的建议吗

谢谢

我想,逻辑是

  • 如果只有一个值,
    value
    json标记应该是原语 绳子
  • 如果有多个值,
    value
    json标记必须是 具有
    名称
    字段的对象数组
  • 对于这种情况,您可以编写一个自定义:

    测试:

    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
    
    您可以从中阅读有关TypeAdapters的更多信息。

    的伪代码:

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

    你能使用POJO类型吗?只需创建一个
    Patch[]
    或一个
    List
    并将其序列化即可。该列表包含两个映射。其中一个映射包含一个元素,该元素是一个仅包含一个元素的单个映射的列表。
    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();