JSONPath 处理特殊字符

 先来看看jsonpath的基础

语法

  • $ 表示文档的根元素
  • @ 表示文档的当前元素
  • .node_name['node_name'] 匹配下级节点
  • [index] 检索数组中的元素
  • [start:end:step] 支持数组切片语法
  • * 作为通配符,匹配所有成员
  • .. 子递归通配符,匹配成员的所有子元素
  • (<expr>) 使用表达式
  • ?(<boolean expr>)进行数据筛选

跟Xpath的对比

XPath JsonPath 说明
/ $ 文档根元素
. @ 当前元素
/ .[] 匹配下级元素
.. N/A 匹配上级元素,JsonPath不支持此操作符
// .. 递归匹配所有子元素
* * 通配符,匹配下级元素
@ N/A 匹配属性,JsonPath不支持此操作符
[] [] 下标运算符,根据索引获取元素,XPath索引从1开始,JsonPath索引从0开始
` ` [,]
N/A [start:end:step] 数据切片操作,XPath不支持
[] ?() 过滤表达式
N/A () 脚本表达式,使用底层脚本引擎,XPath不支持
() N/A 分组,JsonPath不支持
  • 注意

    • JsonPath的索引从0开始计数
    • JsonPath中字符串使用单引号表示,例如:$.store.book[?(@.category=='reference')]中的'reference'

DEMO

{
"store": {
"book": [{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
}, {
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}, {
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}, {
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
XPath JsonPath Result
/store/book/author $.store.book[*].author 所有book的author节点
//author $..author 所有author节点
/store/* $.store.* store下的所有节点,book数组和bicycle节点
/store//price $.store..price store下的所有price节点
//book[3] $..book[2] 匹配第3个book节点
//book[last()] $..book[(@.length-1)],或 $..book[-1:] 匹配倒数第1个book节点
//book[position()<3] $..book[0,1],或 $..book[:2] 匹配前两个book节点
//book[isbn] $..book[?(@.isbn)] 过滤含isbn字段的节点
//book[price<10] $..book[?(@.price<10)] 过滤price<10的节点
//* $..* 递归匹配所有子节点

处理特殊字符的一个应用

  • 来自一个同学的问题

  • 来看具体的代码

    import jsonpath
    s = {
    "stor.e":"hello",
    "stor@e":"hallo"
    }
    print(hex(ord('@'))) # 0x40
    print(hex(ord('.'))) # 0x2e
    print(jsonpath.jsonpath(s, '$.stor\x40e')) # ['hallo']
    print(jsonpath.jsonpath(s, '$.stor\x2ee')) # False
  • 可以看到上面的代码中,json串有特殊字符,如@如.,但@的ASCII的16进制是40,可以通过这种方式得到hallo,但.却不行了。

  • 上面的代码import jsonpath用的库是jsonpath


  • 那jsonpath其实有很多的实现,我们可以用jsonpath-python


    import jsonpath
    s = {
    "stor.e":"hello",
    "stor@e":"hallo"
    }
    print(jsonpath.JSONPath("stor'.'e").parse(s)) # ['hello']
    print(jsonpath.JSONPath("stor'@'e").parse(s)) # ['hallo']
  • 这样就比较轻松了

  • 可以参考https://github.com/zhangxianbing/jsonpath-python

参考资料

最新文章

  1. Spring mvc 验证码的做法
  2. Nginx支持连接数的问题
  3. 解决tomcat占用8080端口问题图文教程
  4. 第三百四十三天 how can I 坚持
  5. html笔记——网页中视频播放,文字滚动
  6. 1023: [SHOI2008]cactus仙人掌图 - BZOJ
  7. python练习程序_员工信息表_基本实例
  8. According to TLD or attribute directive in tag file, attribute value does not accept any expressions
  9. mfc--使用ShellExecute打开另一个可执行程序
  10. Kotlin 初窥门径[2]:流程控制
  11. x64_dbg破解64位WinSnap4.5.6图文视频教程
  12. python tesserocr ImportError: dll loading failed 一个不常遇见的错误,以及简单的python安装方法~
  13. Ubuntu 18.04安装中文输入法
  14. Kettle在windows下分布式集群的搭建
  15. jQuery 表单内容的获取
  16. win10:如何开启自带虚拟机
  17. 把指定的字符串翻译成 pig latin。
  18. 制作R中分词的字典的办法
  19. Excel 2010 如何快速统计一列中相同数值出现的个数 很不错
  20. vue-cli项目配置mock数据(新版本)

热门文章

  1. Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
  2. 万字干货_JDK动态代理及其源码解析 拿捏了
  3. Atlas人工智能基础知识
  4. 新版的Eureka已经移除了基于Ribbon的客户端的负载均衡
  5. 【Java EE】Day04 MySQL多表、事务、事务隔离级别、DCL
  6. Doris安装部署
  7. Javascript | 分别用async await异步方法和Promise来实现一个简易的求职程序
  8. Flask初步认识
  9. Netty-BIO、NIO、AIO、零拷贝-2
  10. .NET周报【12月第4期 2022-12-31】