• java通过key链之间获取JSON中的值


    JSON是一种嵌套数据结构,无规则的模式,获取json中的值只能通过一层一层的get,在实际工作中非常不便,在fastjson的基础上,我写了一个工具类,可以直接通过key链直接获取对应的值

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.regex.Pattern;
    
    public class Test {
        public static void main(String[] args) throws IOException {
            String jsonStr = "{"job":{"content":[{"reader":{"name":{"a":"b"}}}]}}";
            String keyPath = "job.content[0].reader.name.a";
            Object json = getJsonString(jsonStr, keyPath);
            System.out.println(json);
    
    
        }
    
        //判断一个字符串是不是数字
        public static boolean isInteger(String str) {
            Pattern pattern = Pattern.compile("^[-\+]?[\d]*$");
            return pattern.matcher(str).matches();
        }
    
        //将keyPath分割成数组
        public static String[] customSplit(String oldStr) {
            List<String> strings = new ArrayList<>();
            String[] split = oldStr.split("\.");
            for (String s : split) {
                if (s.contains("[")) {
                    String[] subS = s.split("\[|\]");
                    Collections.addAll(strings, subS);
                } else {
                    strings.add(s);
                }
            }
            return strings.toArray(new String[0]);
        }
    
        //最终的value不一定是string,但返回string具有最大的普适性,相比返回JSON或Object更方便使用
        public static String getJsonString(String jsonStr, String keyPath) {
            String[] keyArray = customSplit(keyPath);
            JSON curResult = null;
            JSON curJson;
            if (isInteger(keyArray[0])) {
                curJson = JSON.parseArray(jsonStr);
            } else {
                curJson = JSON.parseObject(jsonStr);
            }
            for (int i = 0; i < keyArray.length; i++) {
                int j = i + 1;
                //判断父Json当前类型,JSONObject
                if (curJson instanceof JSONObject) {
                    //判断子Json类型,分两种情况,最后一个key是无法确认其value类型的,默认返回string
                    if (j == keyArray.length) {
                        return ((JSONObject) curJson).getString(keyArray[i]);
                    }
                    //如果不是最后一个key,可以根据其后的key的类型来判断当前key对应的value类型
                    if (isInteger(keyArray[j])) {
                        curResult = ((JSONObject) curJson).getJSONArray(keyArray[i]);
                    } else {
                        curResult = ((JSONObject) curJson).getJSONObject(keyArray[i]);
                    }
                } //判断父Json当前类型,JSONArray
                else {
                    //判断子Json类型,最后一个key默认返回string
                    if (j == keyArray.length) {
                        return ((JSONArray) curJson).getString(Integer.parseInt(keyArray[i]));
                    }
                    if (isInteger(keyArray[j])) {
                        curResult = ((JSONArray) curJson).getJSONArray(Integer.parseInt(keyArray[i]));
                    } else {
                        curResult = ((JSONArray) curJson).getJSONObject(Integer.parseInt(keyArray[i]));
                    }
                }
                curJson = curResult;
            }
            return curResult.toJSONString();
        }
  • 相关阅读:
    轻松把你的项目升级到PWA
    聊聊React高阶组件(Higher-Order Components)
    java NIO系列教程2
    java NIO系列教程1
    个人笔记
    onclick时间加return和不加return的区别
    URL编码分析与乱码解决方案
    第九天 1-8 RHEL7软件包管理
    第八天 RHEL7.2 文件权限管理(第一部分)
    第七天 Linux用户管理、RHEL6.5及RHEL7.2 root密码破解、RHEL6.5安装vmware tools
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/14155740.html
Copyright © 2020-2023  润新知