将任意json转二维表 不限级

/**限制:
* {}直接下级不能有{}
* []直接下级不能有[]
* []的直接下级类型一致,要么都是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值