当条目的顺序不断变化时如何比较两个JSON字符串[重复]

Posted

技术标签:

【中文标题】当条目的顺序不断变化时如何比较两个JSON字符串[重复]【英文标题】:How to compare two JSON strings when the order of entries keep changing [duplicate] 【发布时间】:2015-07-31 05:55:22 【问题描述】:

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

目前我正在使用equals() 方法进行比较,在这种情况下有什么更好的方法来验证两个字符串。我担心的是两个条目都存在于字符串中,顺序不是imp。

【问题讨论】:

解析字符串,构造自定义类的两个实例并进行比较。 equalscomparing 不同。 比较表示存在顺序关系,而相等性检查检查两个对象是否相同。 您将需要像@kocko 建议的那样编写更复杂的东西。解析字符串以获得您感兴趣的内容并进行比较。 即使顺序不同,两个字符串也应该被视为相等?这就是你说的? @SoumitriPattnaik ....ya 【参考方案1】:

试试这个

 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 

我相信这对你有帮助。

【讨论】:

谢谢你 Siva ...这看起来很有用,希望它能在我的项目中运行良好..之后会接受你的回答,tx!!【参考方案2】:

您可以简单地使用一个类来定义您的对象并使用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"));

然后,当您拥有这两个对象时,您可以轻松地比较它们的属性。

【讨论】:

非常有用,非常感谢,会用这个!!...也很简单..尝试后会接受 太好了,很高兴它有帮助。 .. tx 很多,供您回复.. 它很有用,但我没有在我的代码中使用...对于我的场景,使用地图更好......但是 tx !! 【参考方案3】:

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

【讨论】:

在json有效载荷中的列表的情况下不适用 这也会引发Unchecked cast 警告【参考方案4】:

你也可以使用 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));

【讨论】:

在 Gson 1.7.1 中不起作用 适用于 Gson 2.2.4 如果这两个 JsonElement 不相似,那么我们能弄清楚哪些组件不相似吗?? @drp 这个帖子可能有帮助:***.com/questions/32323256/…

以上是关于当条目的顺序不断变化时如何比较两个JSON字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个没有顺序的具有相同属性的JSON?

js 如何比较两个对象相等

保存Python字典时,json为每个条目添加一个字符[重复]

json.parseobject()的set方法设置顺序

当我从 @RestControler 返回对象时如何在 json 中保持映射键顺序

在 Pyspark/Hive 中处理不断变化的数据类型