原创

java递归解析json字符串

温馨提示:
本文最后更新于 2022年09月11日,已超过 831 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

xdm 中秋快乐,今天记录一下java递归解析json字符串

fastjson并不支持解析多层级的json
比如json下面还有json字符串,不能直接将其转换成json对象

由于自己有这方面的需求,所以就来记录一下自己的实现

实现思路

一共分为三种情况:
①解析出来的是字符串那就直接赋值
②解析出来的是json对象那就递归进行解析
③解析出来的是数组那就循环所有的进行解析(还是分三种情况)

代码实现

现在我们有这样一个json,为了代码简洁,我们从本地文件中读取

file

package com.it1997.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonUtil {
    /**
     * 解析json字符串
     * @param str
     * @return
     */
    public static JSONObject parseStr2JsonObj(String str) {
        JSONObject result = new JSONObject();
        JSONObject strJson = new JSONObject();
        try {
             strJson = JSONObject.parseObject(str);
        } catch (JSONException e) {
            throw new JSONException("参数格式不正确");
        }

        // 遍历每一组键值对
        for (Map.Entry<String, Object> entry : strJson.entrySet()) {
            if (StringUtils.isEmpty(entry.getValue().toString())) {
                continue;
            }

            if (isJsonArray(entry.getValue().toString())) {
                // 如果是json集合那就取集合下面的每一个分别去递归解析
                List list = new ArrayList();
                for (Object o : JSONObject.parseArray(entry.getValue().toString())) {
                    JSONObject jsonObject = o instanceof JSONObject ? ((JSONObject) o) : null;
                    list.add(parseStr2JsonObj(jsonObject.toString()));
                }
                result.put(entry.getKey(), list);
            } else if (isJsonObj(entry.getValue().toString())) {
                // 如果是json对象那就递归解析
                result.put(entry.getKey(), parseStr2JsonObj(entry.getValue().toString()));
            }else {
                // 不是json对象直接赋值
                result.put(entry.getKey(), entry.getValue());
            }
        }
        return result;
    }

    /**
     * 判断字符串是否是json类型的
     * @param str
     * @return
     */
    private static boolean isJsonObj(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        try {
            JSONObject.parseObject(str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断字符串是否是json集合
     * @param str
     * @return
     */
    private static boolean isJsonArray(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        try {
            JSONObject.parseArray(str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) throws IOException {

        File file = new File("D:/home/cxc/json.txt");
        String content = FileUtils.readFileToString(file,"UTF-8");

        JSONObject jsonObject = parseStr2JsonObj(content);
        System.out.println(jsonObject);
    }
}

file

这里可以看到无论是json下是数组还是json对象,都可以进行解析

正文到此结束
本文目录