首页 > 解决方案 > 如何使用 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"
  }
]

我应该如何处理这个?

标签: javajson

解决方案


由于 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());
    }
}

推荐阅读