比较两个json对象的值,包括无序的JsonArray。
public class JsonUtil {
private static Gson gson = new Gson();
public static boolean same(JsonArray a, JsonArray b) {
if (a.size() != b.size()) {
return false;
}
List<JsonElement> aList = toSortedList(a);
List<JsonElement> bList = toSortedList(b);
for (int i = 0; i < aList.size(); i++) {
if (!same(aList.get(i),(bList.get(i)))){
return false;
}
}
return true;
}
public static List<JsonElement> toSortedList(JsonArray a) {
List<JsonElement> tempList = new ArrayList<>();
a.forEach(tempList::add);
tempList.sort(Comparator.comparing(gson::toJson));
return tempList;
}
public static boolean same(JsonElement a, JsonElement b) {
if (a.isJsonObject() && b.isJsonObject()) {
return same((JsonObject) a, (JsonObject) b);
}else if(a.isJsonArray()&&b.isJsonArray()){
return same((JsonArray)a,(JsonArray)b);
}else if(a.isJsonPrimitive()&&b.isJsonPrimitive()){
return same((JsonPrimitive)a,(JsonPrimitive)b);
}else if(a.isJsonNull()&&b.isJsonNull()){
return same((JsonNull)a,(JsonNull)b);
}
return false;
}
public static boolean same(JsonObject a, JsonObject b) {
Set<String> aSet = a.keySet();
Set<String> bSet = b.keySet();
if (!aSet.equals(bSet)) {
return false;
}
for (String aKey : aSet) {
if (!same(a.get(aKey), b.get(aKey))) {
return false;
}
}
return true;
}
public static boolean same(JsonPrimitive a,JsonPrimitive b){
return a.equals(b);
}
public static boolean same(JsonNull a, JsonNull b){
return true;
}
}