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

参考资料

JSONPath 处理特殊字符的更多相关文章

  1. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  2. [SQL Server] 特殊字符、上标、下标处理

    今天遇到一个问题是往 SQL Server 中导入像m².m³这样的单位数据,可是在 SQL Server 中查看到的都是 m2.m3,于是在网上查了一下资料,顺便摘录下来供日后查阅. 一  Wind ...

  3. java转换 HTML字符实体,java特殊字符转义字符串

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  4. 练习JavaScript实现过滤特殊字符

    for循环遍历特殊字符和用户输入字符,然后做比较,返回结果. <script type="text/javascript"> var name = prompt(&qu ...

  5. .net 过滤json等字符串里的特殊字符

    JSON现在是很常见的处理数据的方式了,但是在使用JSON的时候,有些特殊字符会让我们得到非预期的结果.JSon数据中常见的特殊字符有:引号,正斜杠,反斜杠,换行符号等.下面介绍JSON中的特殊字符该 ...

  6. HTML CSS 特殊字符表(转载)

    转载地址:http://blog.csdn.net/bluestarf/article/details/40652011 转载原文地址:http://zhengmifan.com/news/noteb ...

  7. java后台对前端输入的特殊字符进行转义

    转自:http://www.cnblogs.com/yangzhilong/p/5667165.html java后台对前端输入的特殊字符进行转义 HTML: 常见的帮助类有2个:一个是spring的 ...

  8. [Spring] Spring配置文件中特殊字符的规定

    今天查找一个错误,发现在xml里面不能包含特殊字符:&,特来总结一下: XML中共有5个特殊的字符,分别是:&<>“’.如果配置文件中的注入值包括这些特殊字符,就需要进行特 ...

  9. url中的特殊字符问题

    在 使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312, 而在接收页面使用UTF8,这样接收到的参数就可能会 ...

  10. lua 字符串 正则表达式 转义 特殊字符

    string.gsub 函数有三个参数:目标串,模式串,替换串.基本作用是用来查找匹配模式的串,并将使用替换串其替换掉: s = string.gsub("Lua is good" ...

随机推荐

  1. VBA---Basic

    题记: 之前用VBA做过几个小工具,用来实现办公自动化的.在编写过程中也遇到了一些问题,但最终都通过网友们的分享予以解决,现对其中的一些知识点进行总结. common sense 取消文件刷新: Ap ...

  2. python进阶(26)collections标准库

    前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...

  3. MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy

    一.序言 众所周知,MybatisPlus在处理单表DAO操作时非常的方便.在处理多表连接连接查询也有优雅的解决方案.今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询. 由于视 ...

  4. centos使用lftp备份文件

    一直以来项目的文件没有备份,最近需要增加备份,本来以为备份是IT的工作,结果IT说工作忙,拖了半个月给分配完ftp服务器后说不给备份,需要我们开发自己备份...我特么*** 对于ftp备份,咱是没有经 ...

  5. beego-orm-sqlite

    dao.go ``` package daoimport ( "fmt" "github.com/astaxie/beego/orm" "html&q ...

  6. windows10 ftp文件夹错误

    遇到问题: 解决办法: 1. cmd直接访问 ftp ip 2. 启用tftp client 从文件夹访问 注直接访问会弹出如之前报错一样的失败:ftp://ip ftp://用户:密码@ip 使用如 ...

  7. pyinstaller打包TVM/RPC相关脚本及DSO文件

    0. 创建anaconda env numpy中MKL/BLAS库占用很大空间.使用如下命令创建新环境,并替换numpy. conda create -n extranumpy python=3.8. ...

  8. C#调用WPS转换文档到PDF的的实现代码。

    1.WPS安装,最好用这个版本别的版本不清楚,安装Pro Plus2016版本. https://ep.wps.cn/product/wps-office-download.html 2.添加相关的引 ...

  9. linux 挂载 vdi 文件(virtual box虚拟机镜像文件)

    1. 下载 vdfuse 下载地址 2.解压deb文件 解压deb安装包文件,这里不使用安装命令是因为你的virtualbox 可能和vdfuse的版本不一致,导致安装失败,而我们只需要用到 vdfu ...

  10. ArcEngine要素编辑遇到的一些问题

    1.如何开启编辑 IMap myMap = this._Aplication.ActiveView.FocusMap; IWorkspace myWorkspace = (myMap25Sheet.P ...