折腾日记——Json递归

这篇博客探讨了如何将不规则的JSON数据转换为Map对象,特别是关注了当使用JSON.parseObject方法时,未指定Map实现类型的情况。通过源码分析,揭示了默认情况下该方法返回的是HashMap。

 将没有规则的Json转map,list组合的对象。

/** 东华软件 */
package com.dh.monitor.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.alibaba.fastjson.JSON;

/**
 * @author lidehu
 * @date 2018年11月30日
 */
public class ParseJson {

	public static void main(String[] args) {
		String jsonString = JSON.toJSONString(
				new AAA("aString", 1,
						new BBB("bString", 2, Arrays.asList(
								new CCC("cString", 3), 
								new CCC("cString2", 3)))));
	}
	
	public static Object hierarchy(String json) {
                if(json == null)
			return json;
		if (!json.startsWith("{") && !json.startsWith("["))
			return json;
		if (json.startsWith("{")) {
			@SuppressWarnings("unchecked")
			Map<String, Object> map = JSON.parseObject(json, Map.class);
			Set<String> keySet = map.keySet();
			for (String key : keySet)
				map.put(key, hierarchy(map.get(key).toString()));
			return map;
		} 
		if (json.startsWith("[")) {
			List<Object> list = JSON.parseArray(json, Object.class);
			List<Object> list2 = new ArrayList<>();
			for (Object object : list)
				list2.add(hierarchy(object.toString()));
			return list2;
		}
		return null;
	}
	
}


class AAA {
	String aString;
	int a;
	BBB bbb;

	public AAA(String aString, int a, BBB bbb) {
		this.aString = aString;
		this.a = a;
		this.bbb = bbb;
	}

	public String getaString() {
		return aString;
	}

	public void setaString(String aString) {
		this.aString = aString;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public BBB getBbb() {
		return bbb;
	}

	public void setBbb(BBB bbb) {
		this.bbb = bbb;
	}
}

class BBB {
	String bString;
	int b;
	List<CCC> cList;

	public BBB(String bString, int b, List<CCC> cList) {
		this.bString = bString;
		this.b = b;
		this.cList = cList;
	}

	public String getbString() {
		return bString;
	}

	public void setbString(String bString) {
		this.bString = bString;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	public List<CCC> getcList() {
		return cList;
	}

	public void setcList(List<CCC> cList) {
		this.cList = cList;
	}
}

class CCC {
	String cString;
	int c;

	public CCC(String cString, int c) {
		this.cString = cString;
		this.c = c;
	}

	public String getcString() {
		return cString;
	}

	public void setcString(String cString) {
		this.cString = cString;
	}

	public int getC() {
		return c;
	}

	public void setC(int c) {
		this.c = c;
	}
}

疑问:Map<String, Object> map = JSON.parseObject(json, Map.class); 这一行代码并没有定义map的实现类型。 

跟进源码发现,没有指定实现类型会返回一个hashmap。

 

### 实现JSON递归解析 在编程语言中实现JSON递归解析涉及将复杂的JSON数据结构逐步拆解成更简单的部分并逐一处理。这一过程依赖于递归函数来遍历整个JSON树状结构。 #### 解析复杂嵌套结构 当遇到嵌套的对象或数组时,解析器会调用自身以深入下一层级继续解析直到最底层节点被完全解析完毕[^1]。例如,在Python中可以利用内置`json`库完成初步加载之后再通过自定义逻辑进一步细化处理: ```python import json def recursive_parse(data): if isinstance(data, dict): # 如果当前元素是一个字典,则迭代其键值对 for key, value in data.items(): print(f"Parsing object with key {key}") recursive_parse(value) elif isinstance(data, list): # 如果当前元素是一个列表,则迭代其中的每一项 for item in data: print("Parsing array element") recursive_parse(item) else: # 基本类型直接输出或者做其他操作 print(f"Basic type found: {data}") # 测试代码 json_str = '{"name": "Alice", "age": 25, "hobbies": ["reading", {"sport": "basketball"}]}' data = json.loads(json_str) recursive_parse(data) ``` 此段代码展示了如何创建一个名为`recursive_parse()`的功能,该功能接受任何类型的输入——无论是简单数值还是复合型如对象(字典)、数组(列表),并通过递归来确保每一个内部组件都能得到适当处理[^4]。 对于生成JSON的操作同样适用递归方法构建层次化的数据模型;不过这里关注的是读取而非写入场景下的应用实例[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值