如何在条目顺序不断变化时比较两个 JSON 字符串
How to compare two JSON strings when the order of entries keep changing
我有一个类似 - {"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
我相信这对你有帮助。
您可以简单地使用 class 来定义您的对象,并使用 JSONObject 来解析您的 JSON 对象并获取其属性:
Java Class:
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"));
然后当您拥有这两个对象时,您可以轻松比较它们的属性。
Jackson Json parser 有一个很好的特性,它可以将 Json String 解析为 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
你也可以使用 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));
我有一个类似 - {"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
我相信这对你有帮助。
您可以简单地使用 class 来定义您的对象,并使用 JSONObject 来解析您的 JSON 对象并获取其属性:
Java Class:
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"));
然后当您拥有这两个对象时,您可以轻松比较它们的属性。
Jackson Json parser 有一个很好的特性,它可以将 Json String 解析为 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
你也可以使用 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));