我有一個字符串像 - {"state":1,"cmd":1}
,我需要比較這與生成的輸出,但在生成的輸出順序不斷變化,有時它的{"state":1,"cmd":1}
其他時間其{"cmd":1,"state":1}
。如何比較兩個JSON字符串時,條目的順序不斷變化
當前我正在使用equals()
方法進行比較,在這種情況下可以更好地驗證兩個字符串。我關心的只是兩個條目都以字符串形式存在,順序不是imp。
我有一個字符串像 - {"state":1,"cmd":1}
,我需要比較這與生成的輸出,但在生成的輸出順序不斷變化,有時它的{"state":1,"cmd":1}
其他時間其{"cmd":1,"state":1}
。如何比較兩個JSON字符串時,條目的順序不斷變化
當前我正在使用equals()
方法進行比較,在這種情況下可以更好地驗證兩個字符串。我關心的只是兩個條目都以字符串形式存在,順序不是imp。
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有效載荷中的列表 –
試試這個
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 !! – Green
您可以簡單地用一個類來定義你的對象和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"));
然後當你有兩個對象時,你可以輕鬆地比較它們的屬性。
您還可以使用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建議的。解析你感興趣的字符串,然後進行比較。 – Juru