java - 如何使用 javax 中另一个 Json(合并 Json)的新内容更新 Json?
问题描述
我需要比较两个 Json:旧的和新的。但我只需要用新 json 中的新内容更新旧 json。例如:
oldJson.json:
[
{
"thumbnail": "1"
},
{
"thumbnail": "2"
}
]
newJson.json:
[
{
"thumbnail": "1"
},
{
"thumbnail": "2"
},
{
"thumbnail": "3"
}
]
期望的结果oldJson.json
:
[
{
"thumbnail": "1"
},
{
"thumbnail": "2"
},
{
"thumbnail": "3"
}
]
我应该如何处理这个?
解决方案
由于 Json 是JsonArray
, 因此需要Json.createDiff(source.asJsonArray(), target.asJsonArray());
, 而不是Json.createDiff(source.asJsonObject(), target.asJsonObject());
请参阅代码中的注释以获取更多详细信息。
另供参考,请访问将 Java 中的 JSON 文档与 JSON-P 进行比较
import java.io.IOException;
import java.io.StringReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonPatch;
import javax.json.JsonValue;
public class App {
public static void main(String[] args) throws IOException {
Path oldJsonPath = Paths.get("./oldJson.json");
Path newJsonPath = Paths.get("./newJson.json");
String leftJsonDoc = Files.readString(oldJsonPath);
String rightJsonDoc = Files.readString(newJsonPath);
JsonValue source = Json.createReader(new StringReader(leftJsonDoc)).readValue();
JsonValue target = Json.createReader(new StringReader(rightJsonDoc)).readValue();
JsonPatch diff = Json.createDiff(source.asJsonArray(), target.asJsonArray());
// Create a container to collect only operation with add
JsonArrayBuilder container = Json.createArrayBuilder();
// loop through JsonArray to look for JsonObject with "op: add"
for (JsonValue jsonObj : diff.toJsonArray()) {
// get JSONObject(s) with "op: add"
if (jsonObj.toString().contains("op\":\"add")) {
container.add(jsonObj.asJsonObject()); // add it to container
}
}
// Build the JsonArrayBuilder with the payload
JsonPatch payload = Json.createPatch(container.build());
JsonValue patchedPayload = payload.apply(source.asJsonArray());
}
}
推荐阅读
- python - Seaborn Swarmplot 轴间隔格式
- javascript - 猫头鹰旋转木马滑动滑梯让元素更高
- sublimetext3 - 为什么 sublime text 3 上的各种功能突然消失了?
- python - 如何在数据框的列中列出唯一名称?
- excel - 删除和替换单元格引用中打开中断的工作表
- python - 使用 Jupyter 设置环境变量以执行“从模块导入功能”
- vb.net - 检查插入符号是否在屏幕视图上可见
- c++ - 从 Boost local_date_time 对象获取年/月/日 h/m/s/ns?
- r - 我可以在 R 中更有效地编写我的方程式吗?
- java - 如何在 Android 中使用 AES 解密文件