有没有办法比较两个具有不同结构的 属性 文件的键?

Is there a way to compare keys of two property files with different structure?

我有两个 +10.000 行 属性 具有不同结构的文件,我需要知道这两个文件中有哪些键。

我尝试使用 WinMerge 和 FileMerge 等工具,但没有成功。

文件 1:

.
.
.
  "CardShipmentScale.shipmentScaleRegional": "SomeText1",
  "CardShipmentScale.shipmentScaleRegionalExplanation": "SomeText2",
  "CheckboxCard.DAY": "SomeText3",
  "CheckboxCard.MONTH": "SomeText4",
  "SomeOtherKey.SomeOtherSubKey": "SomeOtherText5"
.
.
.

文件 2:

{ "global" : {
.
.
.
      CardShipmentScale : {
          shipmentScaleRegional : "SomeText1",
          shipmentScaleRegionalExplanation : "SomeText2"
                          },
      SomeOtherKey : {
          SomeOtherSubKey : "SomeOtherText5"
                     },

.
.
.

}

在这个例子中,我想要一个工具 o 报告,指出 CardShipmentScale 在 file1 和 file2 中找到,但 CheckboxCard 只在 file1 中。

有什么想法吗?

你可以从这个答案开始。我在那里创建了 JsonFlattener,它将 JSON 文件转换为 Map,其中键是 JSON Path

现在应该很容易检查第二个文件中第一个文件的每个密钥:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile0 = new File("./resource/test.json").getAbsoluteFile();
        File jsonFile1 = new File("./resource/test1.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Map<String, JsonNode> map0 = new JsonFlattener(mapper.readTree(jsonFile0)).flatten();
        Map<String, JsonNode> map1 = new JsonFlattener(mapper.readTree(jsonFile1)).flatten();

        for (Map.Entry<String, JsonNode> node : map0.entrySet()) {
            String keyToCheck = "/global" + node.getKey().replace('.', '/');
            if (map1.containsKey(keyToCheck)) {
                System.out.println(node.getKey() + " exists in both files.");
            } else {
                System.out.println(node.getKey() + " exists only in 1 file.");
            }
        }
    }
}

test.json 包含:

{
  "CardShipmentScale.shipmentScaleRegional": "SomeText1",
  "CardShipmentScale.shipmentScaleRegionalExplanation": "SomeText2",
  "CheckboxCard.DAY": "SomeText3",
  "CheckboxCard.MONTH": "SomeText4",
  "SomeOtherKey.SomeOtherSubKey": "SomeOtherText5"
}

test1.json 包含:

{
  "global": {
    "CardShipmentScale": {
      "shipmentScaleRegional": "SomeText1",
      "shipmentScaleRegionalExplanation": "SomeText2"
    },
    "SomeOtherKey": {
      "SomeOtherSubKey": "SomeOtherText5"
    }
  }
}

对于上述文件应用打印:

/CardShipmentScale.shipmentScaleRegional exists in both files.
/CardShipmentScale.shipmentScaleRegionalExplanation exists in both files.
/CheckboxCard.DAY exists only in 1 file.
/CheckboxCard.MONTH exists only in 1 file.
/SomeOtherKey.SomeOtherSubKey exists in both files.