[英]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.