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" ...
随机推荐
- 强连通分量与tarjan算法初步运用
模板题:B3609 [图论与代数结构 701] 强连通分量 题目描述 给定一张 n 个点 m 条边的有向图,求出其所有的强连通分量. 注意,本题可能存在重边和自环. 输入格式 第一行两个正整数 n , ...
- Java项目有可能做到所有的代码逻辑均可热部署吗?
前言 首先我们明确下什么叫做热部署,热部署是在不重启java虚拟机的前提下,自动更新class的行为,从而更新整个运行时的逻辑. 在java开发领域,热部署一直是一个难以解决的问题,java虚拟机理论 ...
- go工具pprof部署
在做内存分析时,用到了pprof,这里做一下部署介绍和入门级别的使用. pprof是golang的性能工具,有两种交互方式:命令行交互和web交互,同时还支持性能分析数据的图形化展示. 部署pprof ...
- ThinkPhp5 自定义异常处理类
在项目的开发过程中异常抛出尤为重要不仅能够做出友好提示帮助掩盖我们伟大的程序员们尴尬的瞬间,还能做到提示开发人员代码白编写的错误,下面进行自定义异常抛出类,纯属个人理解,希望大家指正 首先在框架中我们 ...
- Windows自带管理工具
exe类notepad 记事本 control 控制面板 mstsc 远程桌面连接explorer 资源管理器 taskmgr 任务管理器resmon 资源监视器 perfmon 性能监视器reged ...
- kubernetes笔记-2-基本操作
一.kubectl的基本操作 语法: kubectl [command] [type] [name] [flags] 语法说明: command:对资源执行相应操作的子命令,如:get.cre ...
- Java lambda表达式基本使用
代码示例:java.lambda.LambdaExpression 1 本质 lambda表达式本质上是对匿名内部类实例的一种简化写法. 1.1 案例 有以下List<Integer>对象 ...
- chrom jsonview的使用
在开发中,我们可能要为不同的系统提供接口,并以说明文档的形式提供接口说明,但我们提供的返回json往往会在页面上乱成一团. 这里我们推荐chrome浏览器的小插件jsonview,他不但有利于我们对接 ...
- 初始化一个ArrayList的多种方式
序言 本片文章用于归纳java中初始化一个ArrayList的几种方式 add方法添加 最基础的方式就是我们在new一个ArrayList之后使用add方法添加元素 /** * 第一种方式,通过add ...
- 4.6:HBase操作实验
〇.概述 1.拓扑结构 2.目标 进行Hbase实验来熟悉Hbase的基本操作. 一.基本操作 1.启动进程 16610 2.连接集群 3.常见操作