2015-05-19 51 views
7

我有一個字符串像 - {"state":1,"cmd":1},我需要比較這與生成的輸出,但在生成的輸出順序不斷變化,有時它的{"state":1,"cmd":1}其他時間其{"cmd":1,"state":1}如何比較兩個JSON字符串時,條目的順序不斷變化

當前我正在使用equals()方法進行比較,在這種情況下可以更好地驗證兩個字符串。我關心的只是兩個條目都以字符串形式存在,順序不是imp。

+7

解析字符串,構建的兩個實例自定義類並進行比較。 –

+1

'equals'與* *比較*不相同。 *比較*表示有訂單關係,而*平等檢查*檢查兩個對象是否相同。 –

+0

你需要寫一些更復雜的東西,比如@kocko建議的。解析你感興趣的字符串,然後進行比較。 – Juru

回答

8

Jackson Json parser有一個很好的功能,它可以將Json字符串解析爲一個Map。然後,您可以查詢條目,或者乾脆問平等:

import com.fasterxml.jackson.databind.ObjectMapper; 

import java.util.*; 

public class Test 
{ 
    public static void main(String... args) 
    { 
     String input1 = "{\"state\":1,\"cmd\":1}"; 
     String input2 = "{\"cmd\":1,\"state\":1}"; 
     ObjectMapper om = new ObjectMapper(); 
     try { 
      Map<String, Object> m1 = (Map<String, Object>)(om.readValue(input1, Map.class)); 
      Map<String, Object> m2 = (Map<String, Object>)(om.readValue(input2, Map.class)); 
      System.out.println(m1); 
      System.out.println(m2); 
      System.out.println(m1.equals(m2)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

輸出是

{state=1, cmd=1} 
{cmd=1, state=1} 
true 
+3

它不適用於json有效載荷中的列表 –

0

試試這個

import java.util.*; 
import com.google.gson.*; 

public class CompareArray { 
    static Set<JsonElement> setOfElements(JsonArray arr) { 
     Set<JsonElement> set = new HashSet<JsonElement>(); 
     for (JsonElement j: arr) { 
      set.add(j); 
     } 
     return set; 
    } 

    public static void main(String[] args) { 
     JsonParser parser = new JsonParser(); 
     Set<JsonElement> arr1elems = 
setOfElements(parser.parse(args[0]).getAsJsonArray()); 
     Set<JsonElement> arr2elems = 
setOfElements(parser.parse(args[1]).getAsJsonArray()); 
     System.out.println("Arrays match? " + arr1elems.equals(arr2elems)); 
    } 
} 

$ java -cp .:gson-2.2.2.jar CompareArray '[{"key1":"value1"}, 
{"key2":"value2"}, {"key3":"value3"}]' '[{"key3":"value3"}, 
{"key1":"value1"}, {"key2":"value2"}]' 
Arrays match? true 

我相信這是對您有所幫助。

+0

謝謝Siva ...這看起來很有用,希望它能在我的項目中運行良好..接受你的答案之後,tx !! – Green

0

您可以簡單地用一個類來定義你的對象和JSONObject解析您的JSON對象並獲取其屬性:

的Java類:

public class MyObject{ 
    private String state; //either int or String 
    private String cmd; 
    //getters and setters 
} 

您解析應該是這樣的:

MyObject obj = new MyObject(); 
JSONParser jsonParser = new JSONParser(); 
// input is your string here 
JSONObject jsonObject = (JSONObject) jsonParser.parse(input); 

//get properties here and set them in your object 
obj.setState(jsonObject.get("state")); 
obj.setCmd(jsonObject.get("cmd")); 

然後當你有兩個對象時,你可以輕鬆地比較它們的屬性。

+0

非常有用,非常感謝,很多人會用這個!!太簡單了..我會在嘗試後接受 – Green

+0

太好了,很高興它有幫助。 –

+0

.... tx很多對你的回覆..它很有用,但我沒有用在我的代碼...對於我的情況使用地圖更好.....但tx! – Green

10

您還可以使用GSON API

JsonParser parser = new JsonParser(); 
JsonElement o1 = parser.parse("{\"state\":1,\"cmd\":1}"); 
JsonElement o2 = parser.parse("{\"cmd\":1,\"state\":1}"); 
System.out.println(o1.equals(o2)); 
+0

不適用於Gson 1.7.1 – Dherik

+2

適用於Gson 2.2.4 – nieschumi

+0

如果這兩個JsonElement不相似,那麼我們能否弄清楚哪些組件是不同? – drp