折腾日记——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。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值