处理JSONObject,JSONArray等对象,需要引入jar包,常见的有2种:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.3</version>
</dependency>
fastjson中JSONObject常用方法总结,请参考FastJson中JSONObject用法及常用方法总结 - 香吧香 - 博客园https://www.cnblogs.com/zjdxr-up/p/9736755.html从上面文章的进行举例
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public void testJSONObject() {
//新建JSONObject对象
JSONObject object1 = new JSONObject();
//在JSONObject对象中放入键值对
object1.put("name", "张三");
object1.put("name1", "张三1");
object1.put("name2", "张三2");
//10.取得JSONObject对象中key的集合
Set<String> keySet= object1.keySet();
for (String key : keySet) {
System.out.println("key: " + key);
}
//11.取得JSONObject对象中的键和值的映射关系
Set<Map.Entry<String, Object>> entrySet = object1.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
System.out.println("entry: " + entry);
String key = entry.getKey();
String value = String.valueOf(entry.getValue());
System.out.println(key + ":" + value);
}
}
// 输出
key: name
key: name1
key: name2
entry: name=张三
name:张三
entry: name1=张三1
name1:张三1
entry: name2=张三2
name2:张三2
json-lib中JSONObject常用方法,除了包含fastjson,它自己的方法:JSONObject.fromObject(), JSONArray.fromObject()
import net.sf.json.JSONObject;
public void testJSONObject() {
String keyStructure = "{\"in_network\":[{\"value\":240000,\"unit\":\"dollar\"}],\"out_of_network\":[{\"type\":\"copay\",\"value_min\":240000,\"value_max\":250000}]}";
JSONObject ks = JSONObject.fromObject(keyStructure);
System.out.println(ks);
}
// 输出
{"in_network":[{"value":240000,"unit":"dollar"}],"out_of_network":[{"type":"copay","value_min":240000,"value_max":250000}]}
import net.sf.json.JSONArray;
public void testJSONArray() {
List<String> list = new ArrayList<String>();
list.add("first");
list.add("second");
JSONArray jsonArray = JSONArray.fromObject(list);
System.out.println(jsonArray);
Map<String, String> map = new HashMap<String, String>();
map.put("name", "张三");
map.put("age", "20");
JSONArray jsonArray2 = JSONArray.fromObject(map);
System.out.println(jsonArray2);
}
// 输出
["first","second"]
[{"name":"张三","age":"20"}]
实例:比较2个复杂的JSONObject对象是否相等
import net.sf.json.JSONObject;
// 第1个JSONObject对象
JSONObject jsonObj = {"in_network":[{"type":"COPAY","value_min":240000,"value_max":250000,"after_deductible":true},{"type":"limit","value":1000000,"unit":day}],"out_of_network":[{"type":"COPAY","value":240000}],"notes":"This plan does not have a deductible."}
// 第2个JSONObject对象
JSONObject jsonObj2 = {"in_network":[{"type":"COPAY","value_min":240000,"value_max":280000,"after_deductible":true},{"type":"limit","value":1000000,"unit":day}],"out_of_network":[{"type":"COPAY","value":240000}],"notes":"This plan does not have a deductible."}
首先,把JSONObject对象转成统一的String对象。
String json = changeValueToString(jsonObj);
String json2 = changeValueToString(jsonObj2);
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.Iterator;
import java.util.Map;
// Change value to String
public String changeValueToString(JSONObject ks) {
Iterator<String> ksIterator = ks.keySet().iterator();
while (ksIterator.hasNext()) {
String key = ksIterator.next();
if (!key.toLowerCase().equals("notes")) {
JSONArray ksArray = ks.getJSONArray(key);
for (int n = 0; n < ksArray.size(); n++) {
JSONObject ksJSONObject = (JSONObject) ksArray.get(n);
for (Object e : ksJSONObject.entrySet()) {
Map.Entry entry = (Map.Entry) e;
entry.setValue(entry.getValue().toString());
}
}
}
}
return ks.toString().toLowerCase();
}
然后,进行对比。
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public boolean DoComparison(String json, String json 2) {
boolean isEqual = true;
JSONObject eks = JSONObject.fromObject(json);
JSONObject rks = JSONObject.fromObject(json2);
if (isEqual && eks.keySet().size() == rks.keySet().size()) {
Iterator<String> eksIterator = eks.keySet().iterator();
while (eksIterator.hasNext()) {
String key = eksIterator.next();
if (rks.get(key) == null) {
isEqual = false;
break;
}
if (key.equals("notes")) {
String eksNotesValue = eks.getString("notes");
String rksNotesValue = rks.getString("notes");
if (eksNotesValue.equals(rksNotesValue)) {
isEqual = true;
} else {
isEqual = false;
break;
}
} else {
JSONArray eksArray = eks.getJSONArray(key);
JSONArray rksArray = rks.getJSONArray(key);
if (eksArray.size() == rksArray.size()) {
boolean isBreak = false;
for (int n = 0; n < eksArray.size(); n++) {
JSONObject eksJSONObject = (JSONObject) eksArray.get(n);
Map<String, Object> keyObjMap = new HashMap<>();
for (Object subKey : eksJSONObject.keySet()) {
keyObjMap.put(subKey.toString(), eksJSONObject.get(subKey));
}
boolean isNodeEqual = true;
for (int m = 0; m < rksArray.size(); m++) {
JSONObject rksJSONObject = (JSONObject) rksArray.get(m);
for (String eachSubKey : keyObjMap.keySet()) {
if (rksJSONObject.get(eachSubKey) == null) {
isNodeEqual = false;
break;
}
if (!rksJSONObject.get(eachSubKey).toString().equals(keyObjMap.get(eachSubKey).toString())) {
isNodeEqual = false;
break;
}
if (rksJSONObject.get(eachSubKey).toString().equals(keyObjMap.get(eachSubKey).toString())) {
isNodeEqual = true;
}
}
if (isNodeEqual && keyObjMap.keySet().size() == rksJSONObject.keySet().size()) {
break;
} else {
isNodeEqual = false;
}
}
isEqual = isNodeEqual;
if(isEqual == false) {
isBreak = true;
break;
}
}
if (isBreak) {
break;
}
} else {
isEqual = false;
break;
}
}}
} else {
isEqual = false;
}
return isEqual;
}
TBD