• python--json、jsonpath


    1、遇到一个问题:android返回的基本都是标准的json格式,当我们想要对层层嵌套的json中找到自己想要的字段并进行校验时

    难道需要一层一层的解析??

    2、使用jsonpath

     1 list_3={'code':100,'result':{'nextpage':1,'page':3,'data':[{'id':111,'fid':12345,'username':'zhonghui','info':[{'id':'1_1','name':'哈哈'}]},{'id':222,'fid':56789,'username':'zhonghuih2','info':[{'id':'2_1','name':'嘿嘿'}]}]}};
     2 #跟目录地址的写法思想一样,比如下面,根目录$下,点,找code这个字段,运行返回列表类型[100]
     3 res_3=jsonpath.jsonpath(list_3,'$.code');
     4 #比如下面,根目录$下,点,找result这个字段,运行返回列表类型[{'nextpage': 1, 'page': 3, 'data': '真实数据'}]
     5 res_3=jsonpath.jsonpath(list_3,'$.result');
     6 
     7 #比如下面,根目录$下,点,找nextpage这个字段,运行返回false,因为根目录下没有nextpage这个字段
     8 res_3=jsonpath.jsonpath(list_3,'$.nextpage');
     9 
    10 #那如果再加一个点,相当于再深一层路径,找nextpage,最终返回正确的[1]
    11 #但不是加一个点就深一层?
    12 res_3=jsonpath.jsonpath(list_3,'$..id');
    13 
    14 #*:代表匹配所有元素节点
    15 #比如下面。相当于匹配根节点下的所有元素,最终返回[100, {'nextpage': 1, 'page': 3, 'data': {'id': 111, 'fid': 12345, 'username': 'zhonghui'}}]
    16 res_3=jsonpath.jsonpath(list_3,'$.*');
    17 
    18 #[]:下标,迭代器,选择,因为选择出来的是list类型,list是可迭代类型,因此可以用[index]筛选
    19 #比如下面,data选择出来的是一['zhonghuihong']
    20 res_3=jsonpath.jsonpath(list_3,'$..data[0].username');
    21 
    22 #多级筛选,data下的所有用户名,比如下面,必须要用两个点,最终结果:['zhonghuih', 'zhonghuih2']
    23 res_3=jsonpath.jsonpath(list_3,'$..data..username');
    24 
    25 
    26 #多级筛选,如果不同层级下都有id这个字段
    27 # 比如下面,实际上会把子层级的id也返回回来[111, '1_1', 222, '2_1'],但是我只需要外层的id,这个还没解决
    28 res_3=jsonpath.jsonpath(list_3,'$..data..id');
    29 
    30 #换一个思路
    31 #比如下面,选择第一项id,最终返回[222],如果使用循环,也能达到预期
    32 res_3=jsonpath.jsonpath(list_3,'$..data[1].id')
    33 
    34 #还是上面
    35 #比如下面,我多加了一个点,此时返回[222, '2_1'],说明匹配了第一项下的所有id,
    36 #
    37 res_3=jsonpath.jsonpath(list_3,'$..data[1]..id')
    #比如最后一个,猜测运行思想:
    在根目录(第一个点)下寻找data----没有找到
    在根目录下一层(第二个点)寻找data----找到data,并返回data[1]
    在data[1](第一个点)下寻找id-----找到了外层id
    在data[1]下一层(第二个点)下寻找id----也找到了id,也一起打印出来
    38 39 print(res_3);


  • 相关阅读:
    Spring标签@Aspect-实现面向方向编程(@Aspect的多数据源自动加载)——SKY
    easyUI参数传递Long型时,前台解析出错的问题——SKY
    javax.servlet.ServletException: Could not resolve view with name‘ XXXX’in servlet with name 'spring'的解决方案-----SKY
    Netty实现java多线程Post请求解析(Map参数类型)—SKY
    java并发编程基础---Sky
    创建100个1k的随机文件到FSxL
    RAID磁盘阵列与LVM逻辑卷管理
    The beginners’ guide to farming Chia Coin on Windows.
    有赞移动Crash平台建设
    Comparisons Serverless
  • 原文地址:https://www.cnblogs.com/shenyexiaoqingxin/p/10456696.html
Copyright © 2020-2023  润新知