Java 比较org.codehaus.jettison.json.JSONArray,不考虑顺序
我有两个JSONArray,里面都是整数 我想在不考虑顺序的情况下,对它们进行同等内容的比较 因此: [1,2]==[1,2]正确 [1,2]==[2,1]正确 杰索纳雷Java 比较org.codehaus.jettison.json.JSONArray,不考虑顺序,java,json,spring,jettison,Java,Json,Spring,Jettison,我有两个JSONArray,里面都是整数 我想在不考虑顺序的情况下,对它们进行同等内容的比较 因此: [1,2]==[1,2]正确 [1,2]==[2,1]正确 杰索纳雷 public boolean equals(Object o) 但是对于[1,2]=[2,1]它返回FALSE 因此,我推出了自己的: public boolean isEqual(JSONArray inputJsonArray, JSONArray outputJsonA
public boolean equals(Object o)
但是对于[1,2]=[2,1]它返回FALSE
因此,我推出了自己的:
public boolean isEqual(JSONArray inputJsonArray,
JSONArray outputJsonArray) throws JSONException{
boolean equal=true, done;
int idx = 0;
if (inputJsonArray.length() == outputJsonArray.length()){
//make sure all elements in input array are in output array
done=false;
while (!done){
if(idx >= inputJsonArray.length()){
done=true;
}
else if (isIntInJsonArray(outputJsonArray,
inputJsonArray.getInt(idx)) == false){
equal = false;
done=true;
}
else{
idx ++;
}
}
if (equal){
//make sure all elements in output array are in input array
done=false;
while (!done){
if (idx >= outputJsonArray.length()){
done=true;
}
else if (isIntInJsonArray(inputJsonArray,
outputJsonArray.getInt(idx)) == false){
equal = false;
done=true;
}
else{
idx++;
}
}
}
}
else{
equal = false;
}
return equal;
}
基本上,我检查两个JSONArray的长度是否相同。如果是,那么我确保outputJsonArray中的每个元素都在inputJsonArray中,反之亦然。执行此操作的主要方法是:
private boolean isIntInJsonArray(JSONArray inputJsonArray, int mInt) throws JSONException{
boolean found=false, done=false;
int idx = 0;
while (!done){
if(idx >= inputJsonArray.length()){
done=true;
}
else if (inputJsonArray.getInt(idx) == mInt){
found = true;
done=true;
}
else{
idx ++;
}
}
return(found);
}
这给我的印象就像一大堆代码。有人知道有没有更简单的方法吗?将数组转换为
JSONObject
,然后使用其equals
方法
JSONArray arr1 = new JSONArray();
JSONArray arr2 = new JSONArray();
arr1.put(1);
arr1.put(2);
arr1.put(3);
arr1.put(4);
arr1.put(5);
arr2.put(2);
arr2.put(1);
arr2.put(3);
arr2.put(5);
arr2.put(4);
JSONObject o1 = arr1.toJSONObject(arr1);
JSONObject o2 = arr2.toJSONObject(arr2);
System.out.println(o1.equals(o2)); //true
查看JSONObject
的源代码,它使用其底层映射来检查相等性
@Override
public boolean equals(Object obj) {
if (obj instanceof JSONObject) {
return myHashMap.equals(((JSONObject)obj).myHashMap);
} else {
return false;
}
}
基础映射的equals
实现忽略了其内容的顺序
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Map))
return false;
Map<K,V> m = (Map<K,V>) o;
if (m.size() != size())
return false;
try {
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext()) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
if (value == null) {
if (!(m.get(key)==null && m.containsKey(key)))
return false;
} else {
if (!value.equals(m.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
return true;
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(映射的实例))
返回false;
Map m=(Map)o;
如果(m.size()!=size())
返回false;
试一试{
迭代器i=entrySet().Iterator();
while(i.hasNext()){
条目e=i.next();
K key=e.getKey();
V value=e.getValue();
如果(值==null){
if(!(m.get(key)==null&&m.containsKey(key)))
返回false;
}否则{
如果(!value.equals(m.get(key)))
返回false;
}
}
}捕获(ClassCastException未使用){
返回false;
}捕获(NullPointerException未使用){
返回false;
}
返回true;
}
将数组转换为JSONObject
,然后使用其equals
方法
JSONArray arr1 = new JSONArray();
JSONArray arr2 = new JSONArray();
arr1.put(1);
arr1.put(2);
arr1.put(3);
arr1.put(4);
arr1.put(5);
arr2.put(2);
arr2.put(1);
arr2.put(3);
arr2.put(5);
arr2.put(4);
JSONObject o1 = arr1.toJSONObject(arr1);
JSONObject o2 = arr2.toJSONObject(arr2);
System.out.println(o1.equals(o2)); //true
查看JSONObject
的源代码,它使用其底层映射来检查相等性
@Override
public boolean equals(Object obj) {
if (obj instanceof JSONObject) {
return myHashMap.equals(((JSONObject)obj).myHashMap);
} else {
return false;
}
}
基础映射的equals
实现忽略了其内容的顺序
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Map))
return false;
Map<K,V> m = (Map<K,V>) o;
if (m.size() != size())
return false;
try {
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext()) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
if (value == null) {
if (!(m.get(key)==null && m.containsKey(key)))
return false;
} else {
if (!value.equals(m.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
return true;
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(映射的实例))
返回false;
Map m=(Map)o;
如果(m.size()!=size())
返回false;
试一试{
迭代器i=entrySet().Iterator();
while(i.hasNext()){
条目e=i.next();
K key=e.getKey();
V value=e.getValue();
如果(值==null){
if(!(m.get(key)==null&&m.containsKey(key)))
返回false;
}否则{
如果(!value.equals(m.get(key)))
返回false;
}
}
}捕获(ClassCastException未使用){
返回false;
}捕获(NullPointerException未使用){
返回false;
}
返回true;
}
codehaus丢弃具有内部数组和对象的JSONArray和JSONObject时,这不会进行缩放。在AWS libs中org.json更改之后,我使用wink apache项目轻松地比较对象。如何使用codehaus抛弃库来比较深层JSON对象?对于具有内部数组和对象的codehaus抛弃JSONArray和JSONObject,这不具有可伸缩性。在AWS libs中org.json更改之后,我使用wink apache项目轻松地比较对象。如何使用codehaus抛弃库比较深层JSON对象?