Java 当条目顺序不断变化时,如何比较两个JSON字符串

Java 当条目顺序不断变化时,如何比较两个JSON字符串,java,json,string,equals,jsonobject,Java,Json,String,Equals,Jsonobject,我有一个类似于-{“state”:1,“cmd”:1}的字符串,我需要将其与生成的输出进行比较,但在生成的输出中,顺序不断变化,即有时其{“state”:1,“cmd”:1}其他时间其{“cmd”:1,“state”:1} 目前我正在使用equals()方法进行比较,在这个场景中,有什么更好的方法可以验证这两个字符串。我担心的是这两个条目都是字符串形式,顺序不是imp。试试这个 import java.util.*; import com.google.gson.*; public cl

我有一个类似于-
{“state”:1,“cmd”:1}
的字符串,我需要将其与生成的输出进行比较,但在生成的输出中,顺序不断变化,即有时其
{“state”:1,“cmd”:1}
其他时间其
{“cmd”:1,“state”:1}

目前我正在使用
equals()
方法进行比较,在这个场景中,有什么更好的方法可以验证这两个字符串。我担心的是这两个条目都是字符串形式,顺序不是imp。

试试这个

 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 
import java.util.*;
导入com.google.gson.*;
公共类比较台{
静态元素集(JsonArray arr){
Set=newhashset();
对于(JsonElement j:arr){
增加(j);
}
返回集;
}
公共静态void main(字符串[]args){
JsonParser=新的JsonParser();
设置棱角=
元素集(parser.parse(args[0]).getAsJsonArray());
设置arr2elems=
元素集(parser.parse(args[1]).getAsJsonArray());
System.out.println(“数组匹配?”+arr1elems.equals(arr2elems));
}
}
$java-cp.:gson-2.2.2.jar comparararray'[{“key1”:“value1”},
{“key2”:“value2”},{“key3”:“value3”}]''[{“key3”:“value3”},
{“key1”:“value1”},{“key2”:“value2”}]'
数组匹配吗?真的

我相信这会对您有所帮助。

您只需使用一个类来定义对象,解析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"));
然后,当您拥有这两个对象时,您可以轻松地比较它们的属性。

有一个很好的功能,它可以将Json字符串解析为映射。然后,您可以查询条目或简单地询问是否相等:

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

您还可以使用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));

解析字符串,构造自定义类的两个实例并进行比较。
equals
与比较不同。比较意味着存在顺序关系,而相等检查一检查两个对象是否相同。您需要编写更复杂的内容,如@kocko建议的。分析您感兴趣的字符串,然后进行比较。即使顺序不同,两个字符串也应被视为相等?这就是你说的吗?@soumtripattnaik…yathank you Siva…这看起来很有用,希望它能在我的项目中很好地运行…之后会接受你的ans,tx!!非常有用,非常感谢,会用这个!!。。。也很简单..尝试后会接受很好,很高兴它有帮助..发送大量回复..它很有用,但我没有在代码中使用..因为我的场景使用地图更好..但是发送!!Gson 1.7.1不适用于Gson 2.2.4如果这两个JsonElement不相似,那么我们可以找出其中哪些组件是不同的吗???@drp此线程可能会有所帮助:它不适用于json Payload中的列表这也会引发
未选中强制转换
警告
 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));