JSONObject与JSONArray的用法

处理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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fion Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值