递归算法 分析json字符串,自制简易表达式

该篇文章介绍了使用递归算法解析JSON字符串,从给定路径data.nodeResults[].result.hitRules[].score中提取score值的过程。作者展示了如何通过遍历和处理JSON对象和数组来获取指定的字段值。
摘要由CSDN通过智能技术生成

json实例

{
  "success": true,
  "code": 200,
  "message": "调用成功",
  "data": {
    "nodeResults": [{
      "success": true,
      "result": {
        "success": true,
        "score": 240.0,
        "hitRules": [{
          "success": true,
          "score": 60.0
        }, {
          "success": true,
          "score": 61.0

        }, {
          "success": true,
          "score": 66.0
        }, {
          "success": true,
          "score": 610.0
        }]
        }
    },  {
      "success": true,
      "result": {
        "success": true,
        "score": 120.0,
        "hitRules": [{
          "success": true,
          "score": 50.0
        }, {
          "success": true,
          "score": 90.0
        }]
      }
    }]
  }
}

现在要获取score的值,路径为data->nodeResults->result->hitRules->score

采用递归算法,层层分析json,自定义一个简单的表达式,对象就直接写属性名,数组的属性名后面加上[]

data.nodeResults[].result.hitRules[].score

算法代码如下:

private static void analysisJSON(String el,String json){

        String[] els = el.split("\\.");
        JSONArray array ;
        JSONObject jsonObject;
        String s = "";
        if(els.length==1){ s = el;}
        else {
            for (int i = 1; i < els.length; i++) {
                s = s + els[i] + ".";
            }
        }
        if("".equals(s)) return;

            JSONObject temp = new JSONObject();

            if (els.length==0) return;

                if(els[0].endsWith("[]")){
                    jsonObject = JSONObject.parseObject(json);
                    if(jsonObject.get(els[0].substring(0,els[0].length()-2))!=null) {
                        array = JSONArray.parseArray(jsonObject.get(els[0].substring(0, els[0].length() - 2)).toString());

                        for (int i = 0; i < array.size(); i++) {
                            analysisJSON(s.substring(0, s.length() - 1), ((JSONObject) array.get(i)).toJSONString());
                        }
                    }

                }else {

                    try {
                        jsonObject = JSONObject.parseObject(json);

                        if (jsonObject.get(els[0]) != null) {
                            if(els.length==1) {
                                System.out.println("已找到匹配的字段------>"+jsonObject.get(els[0]).toString());
                            }else{
                            analysisJSON(s.substring(0, s.length() - 1), jsonObject.get(els[0]).toString());}
                        }

                    }catch (Exception e){

                    }

                }

    }

main方法调用端:

public static void main(String[] args) {
        String text = "";//json内容

        analysisJSON("data.nodeResults[].result.hitRules[].score",text );

    }

运行结果如下:

已找到匹配的字段------>60.0
已找到匹配的字段------>61.0
已找到匹配的字段------>66.0
已找到匹配的字段------>610.0
已找到匹配的字段------>50.0
已找到匹配的字段------>90.0

加个返回List

private static List analysisJSON(String el,String json,List res){

        String[] els = el.split("\\.");
        JSONArray array ;
        JSONObject jsonObject;
        String s = "";
        if(els.length==1){ s = el;}
        else {
            for (int i = 1; i < els.length; i++) {
                s = s + els[i] + ".";
            }
        }
        if("".equals(s)) return null;

            JSONObject temp = new JSONObject();

            if (els.length==0) return res;

                if(els[0].endsWith("[]")){
                    jsonObject = JSONObject.parseObject(json);
                    if(jsonObject.get(els[0].substring(0,els[0].length()-2))!=null) {
                        array = JSONArray.parseArray(jsonObject.get(els[0].substring(0, els[0].length() - 2)).toString());

                        for (int i = 0; i < array.size(); i++) {
                            analysisJSON(s.substring(0, s.length() - 1), ((JSONObject) array.get(i)).toJSONString(),res);
                        }
                    }

                }else {

                    try {
                        jsonObject = JSONObject.parseObject(json);

                        if (jsonObject.get(els[0]) != null) {
                            if(els.length==1) {
                                res.add(jsonObject.get(els[0]).toString());
                                System.out.println("已找到匹配的字段------>"+jsonObject.get(els[0]).toString());
                            }else{
                            analysisJSON(s.substring(0, s.length() - 1), jsonObject.get(els[0]).toString(),res);
                            }
                        }

                    }catch (Exception e){

                    }

                }

                return res;

    }

调用时传入一个List,接收命中字段

 List res =  analysisJSON("data.nodeResults[].result.hitRules[].score", sbf.toString(),new ArrayList<>() );
        System.out.println(JSONObject.toJSONString(res));

后台打印输出

已找到匹配的字段------>60.0
已找到匹配的字段------>61.0
已找到匹配的字段------>66.0
已找到匹配的字段------>610.0
已找到匹配的字段------>50.0
已找到匹配的字段------>90.0
["60.0","61.0","66.0","610.0","50.0","90.0"]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值