自定义解析多层次复杂JSON的方法

/**
     * eg.
     * https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/6029/JSON/?response_type=display
     * molecular-weight jsonpath:
     * j:record->a:Section->j:{TOCHeading:Chemical and Physical Properties}->a:Section->
     * j:{TOCHeading:Computed Properties}->a:Section->j:{TOCHeading:Molecular Weight}->a:Information->j:[0]->j:Value->a:StringWithMarkup->j:[0]->k:String
     * @param jsonPath
     * @return
     */
    public static String getValue(String json,String jsonPath){
          String value = "";
          String[] paths = jsonPath.split("->");
          JSONObject jsonObject = JSONObject.parseObject(json);
          JSONArray jsonArray = null;
          String key =null,keyAndValue=null,jsonIndexStr=null;
          String[] keyValues;
          int attrIndex = 0,jsonIndex =0;
          for(int i=0;i<paths.length;i++){
              //System.out.println(paths[i]);
              attrIndex = paths[i].indexOf("{");
              jsonIndex = paths[i].indexOf("[");
              if(attrIndex > 0){
                  keyAndValue = paths[i].substring(attrIndex+1,paths[i].length()-1);
              }else{
                  key = paths[i].substring(2);
              }
              if(jsonIndex > 0){
                  jsonIndexStr = paths[i].substring(jsonIndex+1,paths[i].length()-1);
                  jsonIndex = Integer.parseInt(jsonIndexStr);
              }
              if(paths[i].startsWith("j:")){

                  if(jsonObject ==null && jsonArray !=null){
                      if(StringUtils.isNotEmpty(keyAndValue)){
                          keyValues = keyAndValue.split(":");
                          //该节点从jsonArray中取
                          for(int j = 0;j<jsonArray.size();j++){
                              jsonObject = jsonArray.getJSONObject(j);
                              if(jsonObject.getString(keyValues[0]).equals(keyValues[1])){
                                  keyAndValue = null;
                                  break;
                              }
                          }
                      }
                      if(StringUtils.isNotEmpty(jsonIndexStr)){
                          jsonObject = jsonArray.getJSONObject(jsonIndex);
                      }
                  }else{
                      jsonObject = jsonObject.getJSONObject(key);
                  }
                  jsonArray = null;
              }else if(paths[i].startsWith("a:")){
                  jsonArray = jsonObject.getJSONArray(key);
                  jsonObject = null;
              }else if(paths[i].startsWith("k:")){
                  if(jsonIndex >= 0){
                      value = jsonArray.getString(jsonIndex);
                  }else{
                      value = jsonObject.getString(paths[i].substring(2));
                  }

              }
          }
        //System.out.println(value);
          return value;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值