我有两个结构不同的+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报告,该报告指示在文件1和文件2中找到CardShipmentScale
,但仅在文件1中找到CheckboxCard
。
有什么想法吗?
答案 0 :(得分:1)
您可以从此答案Flattening a 3 level nested JSON string in java开始。我在那里创建了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.