基于Java的JSON数组铺平解析工具

效果:
解析前:
在这里插入图片描述
解析后
在这里插入图片描述

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author yangjijia
 * @version 1.0
 * @date 2022/2/24 17:26
 */
public class JSONCustomMain {

    Map<String, List> ans = new LinkedHashMap<>();

    private static Pattern linePattern = Pattern.compile("_([a-z])");

    private static final String whenTypeEmptyKey = "emptyKey";

    public static void main(String[] args) throws Exception {
        JSONCustomMain jsonCustomMain = new JSONCustomMain();
        String json = "[{\"field\":\"field\",\"fields\":[{\"childrenField\":\"children\"},{\"childrenField1\":\"childrenField1\",\"childrenField2\":\"childrenField2\",\"childrenArray1\":[\"aaa\",\"bbb\",\"ccc\"],\"childrenArray2\":[{\"array1\":\"array1\"}]}]},{\"stringarray\":[\"string\",\"string\",\"string\"]}]";
        jsonCustomMain.handleArrayData("","",JSON.parseArray(json),new LinkedHashMap<>());
        System.out.println(JSON.toJSONString(jsonCustomMain.ans));
    }

    public void handleArrayData(String keyVal, String arrayName, JSONArray array, Map<String, String> rootData) {
        String preKeyVal = keyVal;
        if (array == null || CollectionUtils.isEmpty(array)) {
            if (keyVal == null || "".equals(keyVal)) {
                keyVal = whenTypeEmptyKey;
            }
            JSONObject record = new JSONObject();
            record.putAll(rootData);
            String key = lineToHump(keyVal);
            List<JSONObject> list = Lists.newArrayList(record);
            if (ans.containsKey(key)) {
                ans.get(key).addAll(list);
            } else {
                ans.put(key, list);
            }
            return;
        }
        int len = array.size();
        for (int i = 0; i < len; i++) {
            JSONObject jsonObject = array.getJSONObject(i);
            Map<String, String> data = new HashMap<>(rootData);
            List<String> arrayKeys = Lists.newArrayList();

            for (String key : jsonObject.keySet()) {
                Object o = jsonObject.get(key);
                if (!(o instanceof JSONArray)) {
                    if (data.containsKey(key)) {
                        key = arrayName + "_" + key;
                    }
                    data.put(key, String.valueOf(o));
                } else {
                    arrayKeys.add(key);
                }
            }

            if (CollectionUtils.isEmpty(arrayKeys)) {
                handleArrayData(keyVal, "", null, data);
            } else {
                for (String arrayKey : arrayKeys) {
                    JSONArray jsonArray = jsonObject.getJSONArray(arrayKey);
                    int size = jsonArray.size();
                    if (size == 0) {
                        data.put(arrayKey, "");
                        handleArrayData(keyVal, arrayKey, null, data);
                    } else {
                        Object o = jsonArray.get(0);
                        if (!(o instanceof JSONObject)) {
                            data.put(arrayKey, StringUtils.join(jsonArray, ","));
                            handleArrayData(keyVal + "_" + arrayKey, arrayKey, null, data);
                        } else {
                            handleArrayData(keyVal + "_" + arrayKey, arrayKey, jsonArray, data);
                        }
                    }
                }
            }
        }
    }

    /**
     * 下划线转驼峰
     *
     * @param str
     * @return
     */
    private String lineToHump(String str) {
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值