【问题标题】:comparing two json nodes recursively and printing the distinct value in java递归比较两个json节点并在java中打印不同的值
【发布时间】:2016-05-04 12:42:31
【问题描述】:

我想比较 java 中的两个大 json 节点,如果它们不同,我需要打印两个节点中不同的值。 如果节点不相等,JsonNode.equals() 将返回 false,但它不会告诉特定的不同值。

谢谢。

代码示例:

    import org.codehaus.jackson.JsonNode; 
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.map.util.JSONPObject;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Map;


    public class TestJsonComp
    {
        static String json = "{\n" +
            "  \"d\" :\n" +
            "  {\n" +
            "    \"results\" :\n" +
            "    [\n" +
            "      {\n" +
            "        \"__metadata\" :\n" +
            "        {\n" +
            "          \"id\" :               \"            ##ServiceRoot##/Submit('##RequisitionUniqueName##')\",\n" +
    "          \"uri\" : \"##ServiceRoot##/Submit('##RequisitionUniqueName##')\",\n" +
    "          \"type\" : \".submitResponse\",\n" +
    "          \"etag\" : \"W/\\\"##RequisitionUniqueName##\\\"\"\n" +
    "        },\n" +
    "        \"status\" : \"ERROR\",\n" +
    "        \"uniqueName\" : \"##RequisitionUniqueName##\",\n" +
    "        \"errors\" :\n" +
    "        {\n" +
    "          \"results\" :\n" +
    "          [\n" +
    "            {\n" +
    "              \"__metadata\" :\n" +
    "              {\n" +
    "                \"id\" : \"##ServiceRoot##/RequisitionErrors(0)\",\n" +
    "                \"uri\" : \"##ServiceRoot##/RequisitionErrors(0)\",\n" +
    "                \"type\" : \".errors\",\n" +
    "                \"etag\" : \"W/\\\"0\\\"\"\n" +
    "              },\n" +
    "              \"id\" : 0,\n" +
    "              \"error_description\" : \"title.\"\n" +
    "            },\n" +
    "            {\n" +
    "              \"__metadata\" :\n" +
    "              {\n" +
    "                \"id\" : \"##ServiceRoot##/RequisitionErrors(1)\",\n" +
    "                \"uri\" : \"##ServiceRoot##/RequisitionErrors(1)\",\n" +
    "                \"type\" : \".errors\",\n" +
    "                \"etag\" : \"W/\\\"1\\\"\"\n" +
    "              },\n" +
    "              \"id\" : 1,\n" +
    "              \"error_description\" : \"Line item 1 must be set.\"\n" +
    "            }\n" +
    "          ]\n" +
    "        }\n" +
    "      }\n" +
    "    ]\n" +
    "  }\n" +
    "}";

        static String jsonCompare = "{\n" +
    "  \"d\" :\n" +
    "  {\n" +
    "    \"results\" :\n" +
    "    [\n" +
    "      {\n" +
    "        \"__metadata\" :\n" +
    "        {\n" +
    "          \"id\" : \"##ServiceRoot##/Submit('##RequisitionUniqueName##')\",\n" +
    "          \"uri\" : \"##ServiceRoot##/Submit('##RequisitionUniqueName##')\",\n" +
    "          \"type\" : \".submitResponse\",\n" +
    "          \"etag\" : \"W/\\\"##RequisitionUniqueName##\\\"\"\n" +
    "        },\n" +
    "        \"status\" : \"ERROR\",\n" +
    "        \"uniqueName\" : \"##RequisitionUniqueName##\",\n" +
    "        \"errors\" :\n" +
    "        {\n" +
    "          \"results\" :\n" +
    "          [\n" +
    "            {\n" +
    "              \"__metadata\" :\n" +
    "              {\n" +
    "                \"id\" : \"##ServiceRoot##/RequisitionErrors(0)\",\n" +
    "                \"uri\" : \"##ServiceRoot##/RequisitionErrors(0)\",\n" +
    "                \"type\" : \".errors\",\n" +
    "                \"etag\" : \"W/\\\"0\\\"\"\n" +
    "              },\n" +
    "              \"id\" : 0,\n" +
    "              \"error_description\" : \"title.\"\n" +
    "            },\n" +
    "            {\n" +
    "              \"__metadata\" :\n" +
    "              {\n" +
    "                \"id\" : \"##ServiceRoot##/RequisitionErrors(1)\",\n" +
    "                \"uri\" : \"##ServiceRoot##/RequisitionErrors(1)\",\n" +
    "                \"type\" : \".errors\",\n" +
    "                \"etag\" : \"W/\\\"1\\\"\"\n" +
    "              },\n" +
    "              \"id\" : 1,\n" +
    "              \"error_descriptio\" : \"Line item 1 must be set.\"\n" +
    "            }\n" +
    "          ]\n" +
    "        }\n" +
    "      }\n" +
    "    ]\n" +
    "  }\n" +
    "}";


        public static void main (String args []) throws IOException, JSONException
        {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode n1 = objectMapper.readTree(json);
            JsonNode n2 = objectMapper.readTree(jsonCompare);
            System.out.print(n1.equals(n2));

        }


    }

【问题讨论】:

  • 向我们展示您的代码以及您的尝试以及 json 结构

标签: java json


【解决方案1】:

检查Parse a JSON Object With an Undetermined Amount of Child Nodes

您可以获得一个节点的子节点列表。然后遍历子节点,获取键/值,并使用键比较第二个节点的每个元素。

【讨论】:

    【解决方案2】:

    我建议使用文件比较器并逐行比较。如果您还介意节点中元素的顺序,这将起作用。如果不考虑顺序,则首先使用 JsonNode.equals() 检查是否相等,并且仅当节点不相等时,才使用文件比较器打印差异。

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 2014-11-01
      • 2023-01-03
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2021-07-15
      相关资源
      最近更新 更多