如何在Java中获取深度嵌套的JSON对象

时间:2019-08-03 11:31:31

标签: java json

我有一个JSON字符串,我想在其中获取嵌套在多个对象中的一个字段的值。我怎样才能以一种出色而高效的方式获得该领域?这是我到目前为止尝试过的代码。它正在工作,但是代码很长。我正在寻找更好的解决方案。

Json响应

function checkCookieMiddleware(req, res, next) {
     const req_cookies = cookie.parse(req.headers.cookie || '');

    if(req_cookies.type){
        if(req_cookies.type === "X"){
            express.static(basePath + "/client/x");
        }
        else if(req_cookies.type === "Y"){
            express.static(basePath + "/client/y");
        }
        else {
            next();
        }
    }
    else {
        next();
    }
  }  


    app.use(checkCookieMiddleware, express.static(basePath + "/client/z"));

冗长的代码

{  
   "status":"success",
   "response":{  
      "setId":1,
      "response":{  
         "match":{  
            "matches":{  
               "matchesSchema":{  
                  "rules":[  
                     {  
                        "ruleId":"Abs"
                     }
                  ]
               }
            }
         }
      }
   }

结果是 JsonParser jp=new JsonParser(); Object obj = jp.parse(JSONString); JSONObject jsonObject =(JSONObject) (obj); JSONObject get1 = jsonObject.getJSONObject("response"); JSONObject get2 = get1 .getJSONObject("response"); JSONObject get3 = get2 .getJSONObject("match"); JSONObject get4 = get3 .getJSONObject("matches"); JSONObject get5 = get4 .getJSONObject("matchesSchema"); JSONObject get6 = get5 .getJSONObject("rules"); JSONArray result = get6 .getJSONArray("rules"); JSONObject result1 = result.getJSONObject(0); String lat = result1 .getString("rule");

从嵌套的json对象(类似ruleId = Abs之类的ruleId中提取是一个很好的选择

2 个答案:

答案 0 :(得分:1)

您可以将Jackson的JsonNode与JsonPath结合使用,以获取ruleId,如下所示:

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObj = mapper.readTree(JSONString);
String lat = jsonObj.at("/response/response/match/matches/matchesSchema/rules/0/ruleId").asText()

它也是null安全的,并且在空节点上返回MissingNode对象,当您执行.asText()时会返回空字符串

答案 1 :(得分:1)

使用JsonPath超级简单。

String ruleId = JsonPath.read(jsonString, "$.response.response.match.matches.matchesSchema.rules[0].ruleId");

或者,如果您多次读取路径,最好预先编译JsonPath表达式

JsonPath ruleIdPath = JsonPath.compile("$.response.response.match.matches.matchesSchema.rules[0].ruleId");
String ruleId = ruleIdPath.read(json);