2015-05-19 23 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