2016-04-27 112 views
-2

我想比較java中的兩個大json節點,如果它們不同,我需要打印兩個節點中不同的值。 如果節點不相等,JsonNode.equals()返回false,但它不會告訴特定的不同值。遞歸地比較兩個json節點並在java中打印不同的值

謝謝。

代碼例如:

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)); 

     } 


    } 
+1

向我們展示您的代碼,並嘗試將其與json結構一起執行 – Ricardo

回答

1

我會建議使用文件比較器並逐行比較。如果您還介意節點中元素的順序,這將起作用。如果不考慮順序,那麼首先使用JsonNode.equals()檢查相等性,並且只有當節點不相等時,才使用文件比較器來打印差異。

相關問題