/**限制:
* {}直接下级不能有{}
* []直接下级不能有[]
* []的直接下级类型一致,要么都是int,要么都是string,要么都是{}
*
* 操作方式:
* 1、第一步:处理json对象,保证同一级中不存在多个集合,多余的集合放到第一个集合中的每一个子元素中
* 2、第二步:深度递归
* */
*
package com.wanxiaobao.dop;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
/**
* @Author: mihuajun 【kobe96688@126.com】
* @Date: 11/17/2016 5:51 PM
*/
public class Test {
public static void main(String[] args) {
String json = "{\"blank\":[\"xxx\",\"yy\"],\"id\":\"001\",\"account\":[{\"name\":\"name1\",\"phones\":[{\"phone\":\"000\"},{\"phone\":\"111\"}],\"account\":\"account1\",\"card\":[{\"cname\":\"cname1\",\"cid\":\"cid1\"},{\"cname\":\"cname2\",\"cid\":\"cid2\"}]},{\"name\":\"name2\",\"account\":\"account2\"}]}";
System.out.println(json);
JSONObject jsonObject = JSON.parseObject(json);
printItem(jsonObject);
System.out.println(jsonObject);
printX(jsonObject,new HashMap<String, Object>());
}
private static List<String> printX(JSONObject jsonObject,Map<String,Object> reMap){
Set<String> keys = jsonObject.keySet();
List<String> currKeys = Arrays.asList(keys.toArray(new String[]{}));
boolean flag = false;
for(String key : keys){
Object value = jsonObject.get(key);
if(value == null)continue;
if(value instanceof JSONArray){
flag = true;
}else{
reMap.put(key,value);
}
}
for(String key : keys){
Object value = jsonObject.get(key);
if(value instanceof JSONArray){
for(Object o1 : (JSONArray)value){
reMap.keySet().removeAll(printX((JSONObject) o1,reMap));
}
}
}
if(!flag) System.out.println(reMap);
return currKeys;
}
private static void printItem(JSONObject jsonObject){
Iterator<String> iterator = jsonObject.keySet().iterator();
String preArrayKey = null;
while (iterator.hasNext()){
String key = iterator.next();
Object value = jsonObject.get(key);
if(value == null)continue;
if(value instanceof JSONArray){
JSONArray currArray = (JSONArray) value;
if(currArray.size() == 0){
jsonObject.put(key,null);
continue;
}
//集合下的子集非JSON对象转JSON对象 eg:[1,2,3]
if(!(currArray.get(0) instanceof JSONArray) && !(currArray.get(0) instanceof JSONObject)){
JSONArray newArray = new JSONArray();
for(Object o1 : currArray){
JSONObject jsonObjectNew = new JSONObject();
jsonObjectNew.put(key,o1);
newArray.add(jsonObjectNew);
}
jsonObject.put(key,newArray);
}
if(preArrayKey == null){
preArrayKey = key;
}else{
for(Object o1 : currArray){
((JSONObject)o1).put(preArrayKey,jsonObject.get(preArrayKey));
}
jsonObject.put(preArrayKey,null);
preArrayKey = key;
}
}
}
if (preArrayKey != null)
for(Object o1 : (JSONArray)jsonObject.get(preArrayKey)){
printItem((JSONObject) o1);
}
}
}
输出:
Connected to the target VM, address: '127.0.0.1:9669', transport: 'socket'
{"blank":["xxx","yy"],"id":"001","account":[{"name":"name1","phones":[{"phone":"000"},{"phone":"111"}],"account":"account1","card":[{"cname":"cname1","cid":"cid1"},{"cname":"cname2","cid":"cid2"}]},{"name":"name2","account":"account2"}]}
{"id":"001","account":[{"name":"name1","account":"account1","card":[{"cname":"cname1","phones":[{"blank":[{"blank":"xxx"},{"blank":"yy"}],"phone":"000"},{"blank":[{"$ref":"$.account[0].card[0].phones[0].blank[0]"},{"$ref":"$.account[0].card[0].phones[0].blank[1]"}],"phone":"111"}],"cid":"cid1"},{"cname":"cname2","phones":[{"$ref":"$.account[0].card[0].phones[0]"},{"$ref":"$.account[0].card[0].phones[1]"}],"cid":"cid2"}]},{"blank":[{"$ref":"$.account[0].card[0].phones[0].blank[0]"},{"$ref":"$.account[0].card[0].phones[0].blank[1]"}],"name":"name2","account":"account2"}]}
{blank=xxx, phone=000, name=name1, cname=cname1, id=001, account=account1, cid=cid1}
{blank=yy, phone=000, name=name1, cname=cname1, id=001, account=account1, cid=cid1}
{blank=xxx, phone=111, name=name1, cname=cname1, id=001, account=account1, cid=cid1}
{blank=yy, phone=111, name=name1, cname=cname1, id=001, account=account1, cid=cid1}
{blank=xxx, phone=000, name=name1, cname=cname2, id=001, account=account1, cid=cid2}
{blank=yy, phone=000, name=name1, cname=cname2, id=001, account=account1, cid=cid2}
{blank=xxx, phone=111, name=name1, cname=cname2, id=001, account=account1, cid=cid2}
{blank=yy, phone=111, name=name1, cname=cname2, id=001, account=account1, cid=cid2}
{blank=xxx, name=name2, id=001, account=account2}
{blank=yy, name=name2, id=001, account=account2}
Disconnected from the target VM, address: '127.0.0.1:9669', transport: 'socket'
Process finished with exit code 0