Python之JsonPath解析json数据

一、JsonPath介绍:

首先,JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。直白点的话就是独立的可以配合多种语言进行匹配的目标值的一种类库,和jmeter中的jsonPath匹配方式很像。优点之一就是 数据可以通过交互方式从客户端上的JSON结构提取,不需要特殊的脚本

二、JSONPath 表达式

JSONPath 表达式总是引用 JSON 结构,就像 XPath 表达式与 XML 文档结合使用一样。由于 JSON 结构通常是匿名的并且不一定具有“根成员对象”,因此 JSONPath 假定$分配给外层对象的抽象名称。

JSONPath表达式可以使用点符号

$.store.book[0].title

括号

$['store']['book'][0]['title']

对于输入路径。内部或输出路径将始终转换为更通用的括号表示法。

JSONPath 允许通配符* 用于成员名称和数组索引。它借用了E4X的后代运算符 '..'和ECMASCRIPT 4数组切片语法建议。[start:end:step]

底层脚本语言的表达式(<expr>)可以用作显式名称或索引的替代方法,如

$.store.book[(@.length-1)].title

对当前对象使用符号“@”。通过如下语法支持过滤?(<boolean expr>)表达式

$.store.book[?(@.price < 10)].title

这是 JSONPath 语法元素与其 XPath 对应元素的完整概述和并排比较。

路径 JSON路径 描述
/ $ 根对象/元素
. @ 当前对象/元素
/ . 或者 [] 子操作员
.. 不适用 母运营商
// .. 递归下降。JSONPath 从 E4X 借用了这种语法。
* * 通配符。所有对象/元素,无论其名称如何。
@ 不适用 属性访问。JSON 结构没有属性。
[] [] 下标运算符。XPath 使用它来迭代元素集合和谓词。在 Javascript 和 JSON 中,它是原生数组运算符。
| [,] XPath 中的联合运算符会产生节点集的组合。JSONPath 允许将备用名称或数组索引作为一个集合。
不适用 [开始:结束:步骤] 数组切片运算符借鉴自 ES4。
[] ?() 应用过滤器(脚本)表达式。
不适用 () 脚本表达式,使用底层脚本引擎。
() 不适用 在 Xpath 中分组

XPath 提供的内容(非缩写语法、运算符和函数中的位置路径)比这里列出的要多得多。此外,下标运算符在 Xpath 和 JSONPath 中的工作方式存在显着差异。

  • XPath 表达式中的方括号始终对先前路径片段产生的节点集进行操作。索引总是从 1 开始。
  • 使用 JSONPath 方括号对前一个路径片段寻址的对象数组进行操作。索引总是从 0 开始。

JSONPath 示例

让我们通过更多示例来练习 JSONPath 表达式。我们从表示书店(原始XML 文件) 的 XML 示例之后构建的简单 JSON 结构开始。

{ "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
    }
  }
}
路径 JSON路径 结果
/store/book/author $.store.book[*].author 商店中所有书籍的作者
//author $..author 所有作者
/store/* $.store.* 所有东西都在店里,就是一些书和一辆红色自行车。
/store//price $.store..price 商店里所有东西的价格。
//book[3] $..book[2] 第三本书
//book[last()] $..book[(@.length-1)] $..book[-1:] 最后一本书。
//book[position()<3] $..book[0,1] $..book[:2] 前两本书
//book[isbn] $..book[?(@.isbn)] 使用 isbn 编号过滤所有书籍
//book[price<10] $..book[?(@.price<10)] 过滤所有比 10 便宜的书
//* $..* XML 文档中的所有元素。JSON 结构的所有成员。

JSONPath示例

import json
import jsonpath
d={
    "error_code":0,
    "stu_info":
    [
        {
            "id":10086,
            "name":"小芳",
            "sex":"女",
            "classname":"三年二班"
        },
        {
            "id": 10000,
            "name": "小龙",
            "sex": "男",
            "classname": "三年三班"
        },
        {
            "id": 10001,
            "name": "小黑",
            "classname": "三年三班"
        }
    ]
}
print(type(d))
name=d["stu_info"][0]["name"]
print(name)
# 模糊匹配 匹配所有学生name
data1=jsonpath.jsonpath(d,"$..name")
print("匹配所有学生name:",data1)
# 精确匹配
# 获取null的值 匹配第一个学生name
data3=jsonpath.jsonpath(d,"$.stu_info[0].name")
print("匹配第一个学生name:",data3)
# 匹配第一个学生name
data4=jsonpath.jsonpath(d,"$.stu_info[0]..name")
print("匹配第一个学生name:",data4)
#匹配前两个学生的信息
data=jsonpath.jsonpath(d,"$.stu_info[:2]")
print("匹配前两个学生的信息:",data)
data5=jsonpath.jsonpath(d,"$.stu_info[?(@.sex=='女')]")
print("匹配性别为女的学生信息:",data5)
data6=jsonpath.jsonpath(d,"$.stu_info[?(@.sex)]")
print("匹配包含性别列的学生信息:",data6)

注意

  • 目前只允许在 JSONPath 表达式中使用单引号。
  • JSONPath 位置内的脚本表达式目前不由jsonPath. 只有全局$和局部@符号通过简单的正则表达式扩展。
  • 在不匹配的情况下jsonPath返回的替代方法可能是将来返回一个空数组。 false
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • JSONPath 表达式 JSONPath 是参照,xpath表达式来解析xml文档的方式,json数据结构通常是...
    阿登20阅读 450评论 0 0
  • 一、正则表达式 1. 提取数据 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定...
    苜蓿a阅读 343评论 0 0
  • XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,而将...
    哈耶卡卡阅读 4,893评论 0 1
  • JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内...
    盗梦者_56f2阅读 1,134评论 0 1
  • lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPa...
    不會變承諾阅读 4,144评论 0 1