JSONObject优雅获取深层字段属性值

开篇说明

如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。
技术栈 >> java
邮箱 >> 15673219519@163.com

描述介绍

根据JSONObject中字段的名称,优雅获取深层属性值

  • 使用示例,取error_entry的数量。JSON的层次结构如下 aggregations.3.buckets.[key=error_entry].doc_count
/*
{
    "took": 3043,
    "timed_out": false,
    "_shards": {
        "total": 7,
        "successful": 7,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 38,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [

        ]
    },
    "aggregations": {
        "3": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "error_entry",
                    "doc_count": 34
                },
                {
                    "key": "error_patch",
                    "doc_count": 4
                }
            ]
        }
    }
}
*/

    public static void main(String[] args) {
        String jsonStr = "{\"took\":3043,\"timed_out\":false,\"_shards\":{\"total\":7,\"successful\":7,\"skipped\":0,\"failed\":0},\"hits\":{\"total\":{\"value\":38,\"relation\":\"eq\"},\"max_score\":null,\"hits\":[]},\"aggregations\":{\"3\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"error_entry\",\"doc_count\":34},{\"key\":\"error_patch\",\"doc_count\":4}]}}};
        JSONObject jsonObject = JSONObject.parseObject(jsonStr); 
        Object obj = getDeepFieldValue(jsonObject, "aggregations.3.buckets.[key=error_entry].doc_count");
        System.out.println(obj.toString());
    }


public Object getDeepFieldValue(JSONObject jsonObject, String jsonPath) {
        String[] split = jsonPath.split("\\.");
        Object currentObject = jsonObject;

        for (String item : split) {
            if (currentObject instanceof JSONObject) {
                JSONObject temp = (JSONObject) currentObject;
                if (temp.containsKey(item)) {
                    currentObject = temp.get(item);
                } else {
                    return null;
                }
            } else if (currentObject instanceof JSONArray) {
                JSONArray temps = (JSONArray) currentObject;
                String[] kv = item.replace("[", "").replace("]", "").split("=");
                boolean exist = false;
                for (Object obj : temps) {
                    if (obj instanceof JSONObject) {
                        JSONObject json = (JSONObject) obj;
                        if (kv.length == 2 && json.containsKey(kv[0]) && String.valueOf(json.get(kv[0])).equals(kv[1])) {
                            currentObject = json;
                            exist = true;
                            break;
                        }
                    }
                }
                if (!exist) {
                    return null;
                }
            } else {
                return null;
            }
        }
        return currentObject;
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放码过来_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值