JSONPath - 用于JSON的XPath

XML经常被强调的优点是可以使用大量工具来分析,转换和有选择地从XML文档中提取数据。XPath是这些强大的工具之一。

现在是时候想知道,如果需要像XPath4JSON这样的东西,它可以解决的问题是什么。

  • 可以在客户端上以JSON结构交互式地找到和提取数据,而无需特殊脚本。
  • 客户端请求的JSON数据可以减少到服务器上的相关部分,例如最小化服务器响应的带宽使用。

如果我们同意,那么从手边的JSON结构中挑选零件的工具确实有意义,就会出现一些问题。它应该如何完成它的工作?JSONPath表达式如何?

由于JSON是C系列编程语言数据的自然表示,因此特定语言具有访问JSON结构的本机语法元素的可能性很高。

以下XPath表达式

/store/book[1]/title

看起来像

x.store.book[0].title

要么

x['store']['book'][0]['title']

在Javascript,Python和PHP中使用包含xJSON结构的变量。在这里我们观察到,特定语言通常具有内置的基本XPath功能。

有问题的JSONPath工具应该......

  • 自然地基于那些语言特征。
  • 仅涵盖XPath 1.0的基本部分。
  • 代码大小和内存消耗都很轻松。
  • 运行效率高。
2007-08-17 | e2 JSONPath表达式

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

JSONPath表达式可以使用注释

$.store.book[0].title

括号 -注释

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

输入路径。内部或输出路径将始终转换为更一般的括号 -注释。

JSONPath允许通配符 *用于成员名称和数组索引。它借用后代从操作者“..” E4X阵列切片语法提案[start:end:step]EcmaScript的4

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

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

使用符号'@'表示当前对象。过滤器表达式通过语法支持,?(<boolean expr>)

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

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

XPath的JSONPath描述
/$根对象/元素
@当前的对象/元素
/。要么 []儿童经营者
..N / A父运营商
//..递归下降。JSONPath借用了E4X的这种语法。
**通配符。所有对象/元素,无论其名称如何。
@N / A属性访问。JSON结构没有属性。
[][]下标运算符。XPath使用它来迭代元素集合和谓词。在Javascript和JSON中,它是本机数组运算符。
|[,]XPath中的Union运算符导致节点集的组合。JSONPath允许使用备用名称或数组索引作为集合。
N / A[开始:结束:步骤]从ES4借来的数组切片运算符。
[]?()应用过滤器(脚本)表达式。
N / A()脚本表达式,使用底层脚本引擎。
()N / A在Xpath中分组

XPath还有很多东西可以提供(位置修补,不是缩写语法,运算符和函数),而不是这里列出的。此外,下标运算符在Xpath和JSONPath中的工作方式存在显着差异。

  • XPath表达式中的方括号始终在由前一个路径片段生成的节点集上运行。指数总是从1开始。
  • 使用JSONPath方括号对前一个路径片段寻址的对象数组进行操作。指数总是从0开始。
2007-08-18 | E3 JSONPath例子

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

{ “store”:{
     “book”:[
      { “category”:“reference”,
         “author”:“Nigel Rees”, “title”:“世纪的谚语”, “价格”:8.95 }, { “类别”:“小说”, “作者”:“伊夫林沃”, “标题”:“荣誉之剑”, “价格”:12.99 }, { “类别”:“小说”, “作者”:“Herman Melville”, “title”:“Moby Dick”, “isbn”:“0-553-21311-3”, “price”:8.99 }, { “类别”:“小说”, “作者”:“JRR托尔金”, “标题”:“指环王”, “isbn”:“0-395-19395-8”, “价格”:22.99 } ] “自行车”:{ “颜色”:“红色”, “价格”:19.95 } } }
XPath的JSONPath结果
/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 number过滤所有书籍
//book[price<10]$..book[?(@.price<10)]过滤所有便宜10以上的书籍
//*$..*XML文档中的所有元素。JSON结构的所有成员。
2007-08-22 | e4 JSONPath实现

JSONPath在Javascript中实现,用于客户端使用并移植到PHP以便在服务器上使用。

用法

您需要做的就是下载其中一个文件

将它包含在您的程序中并使用由单个函数组成的简单API。

jsonPath(obj, expr [, args])

参数:

obj (object|array)
表示JSON结构的对象。
expr (string)
JSONPath表达式字符串。
args (object|undefined)
对象控制路径评估和输出。目前只支持一个成员。
args.resultType ("VALUE"|"PATH")
导致结果为匹配值 (默认值) 或规范化路径表达式。

返回值:

(array|false)
包含与输入路径表达式匹配的值或规范化路径表达式的数组,可用于延迟求值。 false 如果不匹配。

Javascript示例

VAR O = { /*...*/ },   //在'存储'从上面JSON对象 
    RES1 = jsonPath(邻,“$ ..作者”).toJSONString(), res2 = jsonPath(o,“$ .. author”,{resultType:“PATH” })。toJSONString();

PHP示例

我们首先需要将JSON字符串转换为PHP数组。我正在使用Michal MigurskiJSON解析器

require_once('json.php');      // JSON解析器 
require_once('jsonpath.php');  // JSONPath评估程序

$ json = '{...}' ; //来自上面的JSON结构  $ parser = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); $ o = $ parser-> decode($ json); $ match1 = jsonPath($ o,“$ .. author”); $ match2 = jsonPath($ o,“$ .. author”,array(“resultType” => “PATH”)); $ res1 = $ parser-> encode($ match1); $ res2 = $ parser-> encode($ match2);

结果

两者的JavascriptPHP示例结果在下面的JSON阵列(字符串):

RES1:
[ “Nigel Rees”,
   “Evelyn Waugh”,
   “Herman Melville”,
   “JRR Tolkien”
]
RES2:
[ “$ ['store'] ['book'] [0] ['author']”, “$ ['store'] ['book'] [1] ['author']”, “$ ['store ''['book'] [2] ['author']“, ”$ ['store'] ['book'] [3] ['author']“ ]

请注意,返回值jsonPath是一个数组,它也是一个有效的JSON结构。因此,您可能希望再次应用于jsonPath生成的结构,或者使用您喜欢的数组方法之一sort

2007-08-24 | e5 问题
  • 目前,JSONPath表达式中只允许使用单引号。
  • JSONPath位置内的脚本表达式当前未通过递归计算jsonPath。只有全局$和局部@符号通过简单的正则表达式进行扩展。
  • 不匹配的情况下jsonPath返回的替代方法可能是将来返回空数组。 false

 

 

英文:http://goessner.net/articles/JsonPath/

 

转载于:https://www.cnblogs.com/Andy-Blog/p/9489130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值