我正在尝试比较2个JSON文件,它们具有重复值的数组。
我的第一个JSON对象具有如下数组:
"categories": [
"May",
"Apr",
"Mar"
]
Run Code Online (Sandbox Code Playgroud)
我的第二个JSON对象具有如下数组:
"categories": [
"May",
"May",
"Apr",
"Apr",
"Mar",
"Mar"
]
Run Code Online (Sandbox Code Playgroud)
我正在使用平面映射比较JSON,可以在此链接中找到该映射,使用guava比较JSON
这是我的代码的一部分:
private String smartJSONsCompare(JSONObject leftJson, JSONObject rightJson) {
String result = "</br>";
Gson gson = new Gson();
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> leftMap = gson.fromJson(leftJson.toString(), type);
Map<String, Object> rightMap = gson.fromJson(rightJson.toString(), type);
Map<String, Object> leftFlatMap = FlatMapUtil.flatten(leftMap);
Map<String, Object> rightFlatMap = FlatMapUtil.flatten(rightMap);
MapDifference<String, Object> difference = Maps.difference(leftFlatMap, rightFlatMap);
StringBuilder SB = new StringBuilder("</br>");
SB.append("Entries only on LEFT: </br>");
difference.entriesOnlyOnLeft().forEach((key, value) -> SB.append(key + ": " + value + "</br>"));
SB.append("Entries only on RIGHT: </br>");
difference.entriesOnlyOnRight().forEach((key, value) -> SB.append(key + ": " + value + "</br>"));
SB.append("Entries full difference : </br>");
difference.entriesDiffering().forEach((key, value) -> SB.append(key + ": " + value + "</br>"));
result = SB.toString();
return result;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够以一种“更智能”的方式来呈现差异。换句话说:显示JONS中所有不匹配的对象/数组。缺少的内容或添加到比较的JSON中的内容。
对于“类别”数组,我的代码返回一条消息,指出它们是不匹配的,但没有以优雅的方式说明它们之间的区别。
我能做什么?
我在您的解决方案中做了一些更改以获得所需的结果。
我将在List中进行差异检查,因此我将根据您的代码创建将JSON更改为字符串列表的方法:
private static List<String> jsonToList(String json){
List<String> list = new ArrayList<>();
Gson gson = new Gson();
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> jsonMap = gson.fromJson(json, type);
Map<String, Object> flatten = FlatMapUtil.flatten(jsonMap);
flatten.forEach((k, v) -> list.add(v.toString()));
return list;
}
Run Code Online (Sandbox Code Playgroud)
更新
当我回答这个问题时,我做的事情有点快,jsonToList是基于您的代码的。目前,您要的内容过于复杂。因此,我改用以下方法制作了更轻便的版本:
private static List<String> jsonToList(String json) {
JSONObject response = new JSONObject(json);
List<String> list = new ArrayList<>();
JSONArray jsonArray = response.getJSONArray("categories");
if (jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
list.add(jsonArray.get(i).toString());
}
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
就是说,现在您有两种选择,您可以自行决定哪一种最适合您的需求,然后再从中选择。
更新结束
在这个例子中,我做了3个测试例子
String main = "{\"categories\":[\"May\",\"Apr\",\"Mar\"]}";
String json1 = "{\"categories\":[\"May\",\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\"]}";
String json2 = "{\"categories\":[\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\",\"Mar\"]}";
String json3 = "{\"categories\":[\"May\",\"Apr\",\"Mar\",\"Mar\"]}";
Run Code Online (Sandbox Code Playgroud)
在第二步中,我将创建一个
List<String> mainList = jsonToList(main);
List<String> list1 = jsonToList(json1);
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在,我提出了一种方法来利用2列表的额外差异,这意味着,按照您在注释中的要求,我们仅采用重复多次的所有值,然后将它们返回到list中。在这种方法中,我使用hashmap仅计算重复项,而不是将所有重复项重复1次以上:
private static List<String> diffList(List<String> mainList, List<String> secondList){
List<String> list = new ArrayList<String>();
Map<String, Integer> wordCount = new HashMap<>();
for(String word: secondList) {
if(mainList.contains(word)) {
Integer count = wordCount.get(word);
wordCount.put(word, (count == null) ? 1 : count + 1);
if(wordCount.get(word) > 1){
list.add(word);
}
}
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
最后,我将测试所有情况,例如list1:
List<String> diff1 = diffList(mainList, list1);
for (String s : diff1) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
输出将是
May
Apr
Mar
Run Code Online (Sandbox Code Playgroud)
对于list2
Apr
Mar
Mar
Run Code Online (Sandbox Code Playgroud)
对于list3
Mar
Run Code Online (Sandbox Code Playgroud)
现在,我将把视图方法与您的方法分开,并创建一些类似的东西,只是为了使我的代码更清晰易用:
private static String viewResult(List<String> list1, List<String> list2, List<String> duplicate){
String result;
StringBuilder SB = new StringBuilder("</br>");
SB.append("Entries only on LEFT: </br>");
list1.forEach(e -> SB.append(e + "</br>"));
SB.append("Entries only on RIGHT: </br>");
list2.forEach(e -> SB.append(e + "</br>"));
SB.append("Entries full difference : </br>");
duplicate.forEach(e -> SB.append(e + "</br>"));
result = SB.toString();
return result;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我们将所有这些代码放在一起,我将是类似的事情,下面的代码是演示事情的原理,但是从这里您可以将其带入代码的下一个层次:
public static void main(String[] args) {
String main = "{\"categories\":[\"May\",\"Apr\",\"Mar\"]}";
String json1 = "{\"categories\":[\"May\",\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\"]}";
String json2 = "{\"categories\":[\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\",\"Mar\"]}";
String json3 = "{\"categories\":[\"May\",\"Apr\",\"Mar\",\"Mar\"]}";
List<String> mainList = jsonToList(main);
List<String> list1 = jsonToList(json1);
List<String> diff1 = diffList(mainList, list1);
for (String s : diff1) {
System.out.println(s);
}
String view = viewResult(mainList, list1, diff1);
}
private static List<String> jsonToList(String json){
List<String> list = new ArrayList<String>();
Gson gson = new Gson();
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> jsonMap = gson.fromJson(json, type);
Map<String, Object> flatten = FlatMapUtil.flatten(jsonMap);
flatten.forEach((k, v) -> list.add(v.toString()));
return list;
}
private static List<String> diffList(List<String> mainList, List<String> secondList){
List<String> list = new ArrayList<String>();
Map<String, Integer> wordCount = new HashMap<>();
for(String word: secondList) {
if(mainList.contains(word)) {
Integer count = wordCount.get(word);
wordCount.put(word, (count == null) ? 1 : count + 1);
if(wordCount.get(word) > 1){
list.add(word);
}
}
}
return list;
}
private static String viewResult(List<String> list1, List<String> list2, List<String> duplicate){
String result;
StringBuilder SB = new StringBuilder("</br>");
SB.append("Entries only on LEFT: </br>");
list1.forEach(e -> SB.append(e + "</br>"));
SB.append("Entries only on RIGHT: </br>");
list2.forEach(e -> SB.append(e + "</br>"));
SB.append("Entries full difference : </br>");
duplicate.forEach(e -> SB.append(e + "</br>"));
result = SB.toString();
return result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |