繁体   English   中英

如何用Jackson为两个对象创建JSON合并补丁文档

[英]How to create a JSON merge patch document for two objects with Jackson

我们有一个在 Jackson 进行重大投资的应用程序,用于 JSON 处理。 具体来说,REST API 中使用了许多带注释的 model 对象。 现在我们需要调用 REST API,其中 PATCH 需要合并补丁JSON 文档。 鉴于原始 object 和更改后的 object,使用 JSON-P 创建这很简单,但我还没有找到使用 Jackson 来创建的方法。

此代码有效并完成了工作:

    public <T> String createMergePatch(T source, T target) throws IOException {
        var sourceBytes = objectMapper.writeValueAsBytes(source);
        var targetBytes = objectMapper.writeValueAsBytes(target);

        // Changing framework - not at all ideal
        var sourceJson = Json.createReader(new ByteArrayInputStream(sourceBytes)).readValue();
        var targetJson = Json.createReader(new ByteArrayInputStream(targetBytes)).readValue();
        var mergePatch = Json.createMergeDiff(sourceJson, targetJson);
        return mergePatch.toJsonValue().toString();
    }

当源对象和目标对象转换为 JSON 时使用 Jackson 注释。然后,我们正在切换框架以获得 createMergeDiff 可以处理的内容。 它效率低下,我们需要包含我们不想要的依赖项,但 output 是正确的。

最后,我的问题是,是否有更好的方法可以使用 Jackson 执行此操作,而无需引入另一个 JSON 框架,也无需在 881569990078588 和对象之间往返?

这是我认为您要求的示例。

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
    
    String json1 = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
    String json2 = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\",\"country\":\"USA\"}";
    String result = createMergePatchWith(json1, json2);
    System.out.println(result);

}

public static String createMergePatchWith(String json1, String json2) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    JsonNode jsonNode1 = mapper.readTree(json1);
    JsonNode jsonNode2 = mapper.readTree(json2);
    JsonNode mergePatch = doMergeWithJackson(jsonNode1, jsonNode2);
    return mapper.writeValueAsString(mergePatch);
}

private static JsonNode doMergeWithJackson(JsonNode jsonNode1, JsonNode jsonNode2) {
    if (jsonNode1.isObject() && jsonNode2.isObject()) {
        ObjectNode objectNode = (ObjectNode) jsonNode1;
        jsonNode2.fields().forEachRemaining(entry -> {
            JsonNode value = entry.getValue();
            if (value.isObject()) {
                objectNode.set(entry.getKey(), doMergeWithJackson(objectNode.get(entry.getKey()), value));
            } else {
                objectNode.set(entry.getKey(), value);
            }
        });
        return objectNode;
    }
    return jsonNode2;
}

}

Output 其中:{"name":"John","age":30,"city":"New York","country":"USA"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM