JSONPATH处理json

本文主要记录

 PredicateContext  和 Filter的用法  其中 
 PredicateContext 是用来删除替换。 Filter是用来过滤,具体用法参考文中代码

入门请参照:http://www.ibloger.net/article/2329.html

项目中有一串json如下

{
  "msg":"success",
  "paginationFlrs":"[[2141,2142]]",
  "floorList":[
    {
      "template":"gonggao",
      "backgroundColor":"#ffffff",
      "annConfig":{
        "showTag":"1",
        "pictureUrl":"//m.360buyimg.com/babel/jfs/t16324/112/2365900951/4786/e8c70b4/5aab38d6N2b46b43e.jpg!q70.jpg",
        "showMore":"1",
        "expoSrv":"2142_0-0-YU0000008007-M#2-0#2-2#bingo_null",
        "jump":{
          "des":"m",
          "srv":"00011857_2142_YU0000008007_0-0-2_0-0-YU0000008007-M#2-0#2-2#bingo",
          "params":{
            "innerLink":"",
            "url":"//www.jd.com"
          }
        }
      },
      "ofn":"2",
      "adsList":[
        Object{...},
        Object{...},
        {
          "picWidth":0,
          "extension_id":"",
          "picHeight":0,
          "pictureUrl":"",
          "link":"1000015268",
          "progId":"",
          "materialId":"2400016804",
          "content":"广告说明333",
          "advertId":"2400016804",
          "name":"三只松鼠京东自营旗舰店",
          "linkType":"3",
          "sortNum":3,
          "desc":"广告说明333",
          "jump":{
            "des":"newgoodshop",
            "srv":"00011857_2142_00014028_2400016804_3_2_0_0_2_0-0-2_00014028-00218324-2400016804-N#0-2-3--45--#1-0-#1-#yhd",
            "params":{
              "shopId":"1000015268",
              "clickUrl":""
            }
          },
          "expoSrv":"2142_00014028-00218324-2400016804-N#0-2-3--45--#1-0-#1-#yhd_2"
        },
        {
          "picWidth":531,
          "extension_id":"",
          "picHeight":240,
          "pictureUrl":"//m.360buyimg.com/babel/s509x230_jfs/t18658/296/1518342736/22452/7a7f78e1/5acdbfe7Nf96760db.jpg!q70.jpg",
          "link":"//mall.jd.com/index-1000015268.html",
          "progId":"",
          "materialId":"2400016805",
          "content":"广告说明444",
          "advertId":"2400016805",
          "name":"adsfasdf",
          "linkType":"6",
          "sortNum":4,
          "desc":"广告说明444",
          "jump":{
            "des":"babelfloor",
            "srv":"00011857_2142_00014028_2400016805_4_2_0_0_2_0-0-2_00014028-00218324-2400016805-N#0-2-6--45--#1-0-#1-#yhd",
            "params":{
              "floor":"//mall.jd.com/index-1000015268.html",
              "clickUrl":""
            }
          },
          "expoSrv":"2142_00014028-00218324-2400016805-N#0-2-6--45--#1-0-#1-#yhd_2"
        },
        {
          "picWidth":120,
          "extension_id":"",
          "picHeight":120,
          "pictureUrl":"//m.360buyimg.com/babel/s115x115_jfs/t18679/301/1529160602/3767/6ccac405/5acdbff3N222dc5bb.jpg!q70.jpg",
          "link":"//mall.jd.com/index-1000015268.html",
          "progId":"",
          "materialId":"2400016806",
          "content":"广告说明555",
          "advertId":"2400016806",
          "name":"asdfas",
          "linkType":"1",
          "sortNum":5,
          "desc":"广告说明555",
          "jump":{
            "des":"m",
            "srv":"00011857_2142_00014028_2400016806_5_2_0_0_2_0-0-2_00014028-00218324-2400016806-M#0-2-1--45--#1-0-#1-#yhd",
            "params":{
              "innerLink":"",
              "url":"//mall.jd.com/index-1000015268.html",
              "clickUrl":""
            }
          },
          "expoSrv":"2142_00014028-00218324-2400016806-M#0-2-1--45--#1-0-#1-#yhd_2"
        }
      ],
      "sameColor":"0",
      "moduleId":2142,
      "floorNum":"1",
      "yhd_available":"true"
    }
  ],
  "item":"0",
  "backgroundColor":"",
  "code":"0",
  "paginationParams":[
    "1"
  ],
  "pagination":true,
  "asyncInterfaceBack":{
    "templatePlatform":"3"
  },
  "pageId":"92152",
  "visReState":{
    "matGrpN":2,
    "matReN":1
  },
  "head":{
    "template":"page_setup",
    "headSourceId":"",
    "isHeadCusCode":"0",
    "pageBgPicStyle":"0",
    "footSourceId":"",
    "pageBgColor":"#FFFFFF",
    "isFootCusCode":"0",
    "pageBgPicUrl":"",
    "pageName":"京东(JD.COM)-正品低价、品质保证、配送及时、轻松购物!",
    "benefit":null,
    "name":null
  },
  "activityId":"00011857",
  "returnMsg":"success",
  "hasPerData":"0",
  "encodeActivityId":"2RxsenZAdASTG6vrpRebEEUiVzN7",
  "subCode":"0",
  "useDiscovery":"",
  "transParam":"{"bsessionId":"cba68429-c631-4d45-a5c9-b9c27e93f8b2","babelChannel":"","actId":"00011857","enActId":"2RxsenZAdASTG6vrpRebEEUiVzN7","pageId":"92152"}",
  "floatLayer":{

  },
  "biimpr":"00011857_92152"
}

要对其中的key按条件删除过滤以及替换处理。处理如下。其中 

 
protected Map<String, Object> handleElements(final Map<String, Object> floor) {
   if (floor == null) {
      return floor;
   }
   Object templateObject = JsonPath.read(floor,"$.template");
   if (templateObject == null) {
      return floor;
   }
   String template = (String) templateObject;
   if (isValidTemplate(template)) {
      //保留链接类型为无、链接、商祥、商家、搜索五种类型,无类型没有"jump.des"字段,其余对应字段分别为"skudetail", "newgoodshop", "productList",对于productList类型,过滤search,category子类型
      parse(floor).delete("$.adsList[?]", filter(where("jump.des").exists(true)).and(where("jump.des").nin("m", "skudetail", "newgoodshop", "productList")));
      //处理“更多”得链接。
      parse(floor).delete("$.annConfig.jump.params[?]", new Predicate() {
         @Override
         public boolean apply(PredicateContext ctx) {
            Map<String, String> item = ctx.item(Map.class);
            String url = parse(item).read("$.url", String.class);
            String YHDUrl = handlePcLink(url);
            if (YHDUrl.equals("")) {//匹配不上链接直接删除。
               return true;
            } else {//匹配上了  替换链接
               parse(floor).set("$.annConfig.jump.params.url", YHDUrl);
               return false;
            }
         }
      });
      //处理 des=m 的链接
      parse(floor).delete("$.adsList[?]", new Predicate() {
         int index = -1;
         @Override
         public boolean apply(PredicateContext ctx) {
            index++;
            Map<String, String> item = ctx.item(Map.class);
            String des = parse(item).read("$.jump.des", String.class);
            if (des == null || !des.equals("m")) {
               return false;
            } else {
               String url = parse(item).read("$.jump.params.url", String.class);
               String YHDUrl = handlePcLink(url);
               if (YHDUrl.equals("")) {//匹配不上链接直接删除。
                  return true;
               } else {//匹配上了  替换链接
                  parse(floor).set("$.adsList["+index+"].jump.params.url", YHDUrl);
                  return false;
               }
            }
         }
      });

   }
   return floor;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Python 中的 json 和 re 模块配合使用来生成 JSON 对象。 首先,我们需要安装 jsonpath-ng 库来处理 jsonpath,可以通过以下命令安装: ``` pip install jsonpath-ng ``` 然后,我们可以使用以下代码示例来根据 jsonpath 生产 json 对象: ```python import json import re from jsonpath_ng import parse # 根据 jsonpath 和对应的值生成 json 对象 def create_json_object(jsonpath, value): # 解析 jsonpath jsonpath_expr = parse(jsonpath) # 构建 json 对象 json_obj = {} for match in jsonpath_expr.find(json_obj): # 获取 jsonpath 的 key key = str(match.full_path) # 通过正则表达式获取 jsonpath 的层级 m = re.findall(r'\[\'(.*?)\'\]', key) for i in range(len(m)): m[i] = int(m[i]) if m[i].isdigit() else m[i] # 根据层级构建 json 对象 obj = json_obj for j in range(len(m) - 1): if m[j] not in obj: if isinstance(m[j + 1], int): obj[m[j]] = [] else: obj[m[j]] = {} obj = obj[m[j]] if isinstance(m[-1], int): obj.append(value) else: obj[m[-1]] = value return json.dumps(json_obj) # 示例: jsonpath = "$['person'][0]['name']" value = "Tom" json_obj = create_json_object(jsonpath, value) print(json_obj) ``` 输出结果: ``` {"person": [{"name": "Tom"}]} ``` 该代码示例中,我们定义了一个 `create_json_object` 函数,它接受两个参数 `jsonpath` 和 `value`,根据这两个参数生成 JSON 对象。我们使用 jsonpath-ng 库解析 jsonpath,然后使用正则表达式获取 jsonpath 的层级,最后根据层级构建 JSON 对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值