可以将两个JSON文档与Jackson JSON库合并吗?我基本上是将Jackson映射器与简单的Java地图结合使用。
我试着在谷歌和杰克逊的文档中搜索,但什么也找不到。
发布于 2012-03-28 17:08:01
一种方法是像这样使用ObjectReader
:
MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class);
ObjectReader updater = objectMapper.readerForUpdating(defaults);
MyBean merged = updater.readValue(overridesJson);
它将合并来自两个来源的数据。这只做了一个浅拷贝,也就是说,不会对包含的对象进行递归合并。
否则,您可能只需要将JSON作为树(JsonNode
)读取,循环遍历内容并手动合并。这通常是有意义的,因为合并的规则不是微不足道的,每个人都有自己的合并应该如何工作的想法。
编辑:(2017年4月3日)
根据@Fernando Correia的评论,实际上在即将到来的杰克逊2.9 (将于2017年4月或5月发布)中添加了一个新的feature,最终允许深度合并。
发布于 2012-07-12 20:19:27
受StaxMans answer的启发,我实现了这个合并方法。
public static JsonNode merge(JsonNode mainNode, JsonNode updateNode) {
Iterator<String> fieldNames = updateNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode jsonNode = mainNode.get(fieldName);
// if field exists and is an embedded object
if (jsonNode != null && jsonNode.isObject()) {
merge(jsonNode, updateNode.get(fieldName));
}
else {
if (mainNode instanceof ObjectNode) {
// Overwrite field
JsonNode value = updateNode.get(fieldName);
((ObjectNode) mainNode).put(fieldName, value);
}
}
}
return mainNode;
}
希望这对某些人有帮助。
发布于 2015-09-08 00:32:06
受Arn回答的启发。编辑它以添加节点中可能包含节点数组的情况。
public static JsonNode merge(JsonNode mainNode, JsonNode updateNode) {
Iterator<String> fieldNames = updateNode.fieldNames();
while (fieldNames.hasNext()) {
String updatedFieldName = fieldNames.next();
JsonNode valueToBeUpdated = mainNode.get(updatedFieldName);
JsonNode updatedValue = updateNode.get(updatedFieldName);
// If the node is an @ArrayNode
if (valueToBeUpdated != null && valueToBeUpdated.isArray() &&
updatedValue.isArray()) {
// running a loop for all elements of the updated ArrayNode
for (int i = 0; i < updatedValue.size(); i++) {
JsonNode updatedChildNode = updatedValue.get(i);
// Create a new Node in the node that should be updated, if there was no corresponding node in it
// Use-case - where the updateNode will have a new element in its Array
if (valueToBeUpdated.size() <= i) {
((ArrayNode) valueToBeUpdated).add(updatedChildNode);
}
// getting reference for the node to be updated
JsonNode childNodeToBeUpdated = valueToBeUpdated.get(i);
merge(childNodeToBeUpdated, updatedChildNode);
}
// if the Node is an @ObjectNode
} else if (valueToBeUpdated != null && valueToBeUpdated.isObject()) {
merge(valueToBeUpdated, updatedValue);
} else {
if (mainNode instanceof ObjectNode) {
((ObjectNode) mainNode).replace(updatedFieldName, updatedValue);
}
}
}
return mainNode;
}
https://stackoverflow.com/questions/9895041
复制相似问题