添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

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

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

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);

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

正文到此结束