JSONPath 处理特殊字符
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 处理特殊字符的更多相关文章
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- [SQL Server] 特殊字符、上标、下标处理
今天遇到一个问题是往 SQL Server 中导入像m².m³这样的单位数据,可是在 SQL Server 中查看到的都是 m2.m3,于是在网上查了一下资料,顺便摘录下来供日后查阅. 一 Wind ...
- java转换 HTML字符实体,java特殊字符转义字符串
为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...
- 练习JavaScript实现过滤特殊字符
for循环遍历特殊字符和用户输入字符,然后做比较,返回结果. <script type="text/javascript"> var name = prompt(&qu ...
- .net 过滤json等字符串里的特殊字符
JSON现在是很常见的处理数据的方式了,但是在使用JSON的时候,有些特殊字符会让我们得到非预期的结果.JSon数据中常见的特殊字符有:引号,正斜杠,反斜杠,换行符号等.下面介绍JSON中的特殊字符该 ...
- HTML CSS 特殊字符表(转载)
转载地址:http://blog.csdn.net/bluestarf/article/details/40652011 转载原文地址:http://zhengmifan.com/news/noteb ...
- java后台对前端输入的特殊字符进行转义
转自:http://www.cnblogs.com/yangzhilong/p/5667165.html java后台对前端输入的特殊字符进行转义 HTML: 常见的帮助类有2个:一个是spring的 ...
- [Spring] Spring配置文件中特殊字符的规定
今天查找一个错误,发现在xml里面不能包含特殊字符:&,特来总结一下: XML中共有5个特殊的字符,分别是:&<>“’.如果配置文件中的注入值包括这些特殊字符,就需要进行特 ...
- url中的特殊字符问题
在 使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312, 而在接收页面使用UTF8,这样接收到的参数就可能会 ...
- lua 字符串 正则表达式 转义 特殊字符
string.gsub 函数有三个参数:目标串,模式串,替换串.基本作用是用来查找匹配模式的串,并将使用替换串其替换掉: s = string.gsub("Lua is good" ...
随机推荐
- 2022春每日一题:Day 30
题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过 ...
- php自定义分页类
<?php class Paging { private $totalStrip; //总条数 private $pageStrip; //每页条数 private $totalPages; / ...
- php统一的gocheck方法
这半个月断断续续在学习用PHP的ThinkPHP框架开发后端API.现在总结记录一下开发一个接口需要做好哪些事,以此提高开发效率,并且也有不错的扩展性. 一.流程概要 基本是这么一个流程,略过环境搭建 ...
- Go语言核心36讲49
我们在上一篇文章中简单地讨论了网络编程和socket,并由此提及了Go语言标准库中的syscall代码包和net代码包. 我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义 ...
- win10+vs2019 编译webrtc m108
不能访问外网途径的捷径 已经下载好的资源,可以直接生成工程: https://pan.baidu.com/s/14plvXZD_qX9nn441RbsCwA?pwd=ww8c 该资源可以跳过的步骤 步 ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- Java学习中实现的功能trick
1.注册时,不用确认就可以知道用户名是否存在 技术:json+ajax 章节:javaweb->day22json&ajax 2.不常变化的导航栏.城市等信息存入数据库,通过redis做 ...
- ArcObjects SDK 012 PageLayout和Page
1.从ArcMap角度看结构 一个Mxd文件包含一个PageLayout对象和一个多多个Map对象,每个Map会被包成MapFrame,添加到PageLayout中.我们用ArcMap打开一个mxd文 ...
- python2和python3的区别(1)
1.python2和python3的解释器的默认编码不同 python2解释器的编码默认用的是 ascii python3解释器的编码默认用的 utf-8 2.python2和python3输入的表示 ...
- json 提取器将提取的所有id拼接成字符串
1.添加json提取器,提取所有的id 2.添加调试后置处理器查看buildid_ALL值以及类型 当需要将提取的id拼接成字符串时,此时使用json提取器并勾选Compute concatenati ...