相关问题
更多相关问题 →JSONPath 是什么?它和 XPath 有什么关系?
JSONPath 是一种用于选取 JSON 结构部分的路径表达式语法,由 Stefan Goessner 在 goessner.net 上提出。它的设计目标很直接:让 JSON 寻址像 XPath 处理 XML 一样自然。JSONPath 借鉴了 XPath 1.0 的思路,但只覆盖其核心部分,并基于 C 语言家族的特性来设计表达式。如果你需要在嵌套 JSON 中定位某个字段或一组节点,JSONPath 就是为此准备的轻量方案。
JSONPath 解决什么问题
JSON 结构本身用 C 家族语言处理并不困难,但缺少一种通用的、声明式的寻址方式。XPath 在 XML 世界里承担了这个角色,JSON 却没有对应物。JSONPath 填补的正是这个空白:用一条路径表达式,从任意 JSON 结构中选出想要的部分。
和 XPath 的对应关系
JSONPath 常被理解为“XPath for JSON”,两者的表达式形式高度相似。以 goessner.net 给出的例子为例:
| 用途 | JSONPath | XPath |
|---|---|---|
| 选取某本书的标题 | $..book[2].title |
//book[3]/title |
可以看到,JSONPath 用 $ 表示根,用 .. 表示递归下降,用 [n] 表示数组下标,整体结构和 XPath 的 //、[n] 一一对应。区别在于 JSONPath 只保留 XPath 1.0 的核心能力,不追求完整覆盖。
语法元素与实现
据 goessner.net 介绍,JSONPath 由一小组共九个语法元素构成,足以组合出复杂的路径表达式。它同时提供了轻量实现:
jsonpath.js:面向客户端,在浏览器中访问 JSON 结构jsonpath.php:面向服务端
这两个文件可以免费下载。此外,Atif Aziz 在很短时间内贡献了 C# 移植版 jsonpath.cs。
谁适合用它
如果你在做前端或 PHP 项目,需要从深层嵌套的 JSON 中提取数据,又不想写一堆循环和条件判断,JSONPath 是一个直接可用的选择。它语法简洁、实现轻量,且与 XPath 的心智模型一致,熟悉 XPath 的人几乎可以立刻上手。
JSONPath 的基本语法元素有哪些?
JSONPath 是一套用于定位 JSON 结构片段的路径表达式语法,由 Stefan Goessner 在 goessner.net 上提出。它的设计目标与 XPath 类似:XPath 用来选取 XML 文档中的节点,JSONPath 用来选取 JSON 中的部分数据。根据 goessner.net 的说明,JSONPath 最初只包含九种语法元素,用它们就能组合出相当复杂的路径表达式。下面按“从根出发、逐层定位”的顺序说明这些元素的作用。
从根开始:$
路径表达式以 $ 开头,表示 JSON 结构的根。例如:
{
"store": {
"book": [
{ "title": "A", "price": 10 },
{ "title": "B", "price": 20 }
]
}
}
$.store 选取根下的 store 对象。
访问成员与数组:点号与方括号
.用于访问对象成员,如$.store.book。[]既可以按名字访问成员,也可以按索引访问数组元素,如$.store.book[0]取第一本书。- 两者可以混用,
$.store.book[2].title就是 goessner.net 给出的示例写法,对应 XPath 中的//book[3]/title(注意 JSONPath 索引从 0 开始,XPath 位置从 1 开始)。
通配与递归:* 和 ..
*是通配符,匹配当前层级下的任意成员或元素,如$.store.*。..是递归下降,用于跨层级查找,不关心中间隔了多少层。$..book会找出结构中任意深度的book;$..book[2].title则先递归找到book,再取第三项的书名。
数组切片与并集
- 切片写在方括号里,形如
[start:end:step],用于选取数组的一段,例如$.store.book[0:2]。 - 并集用逗号分隔多个名字或索引,如
$.store.book[0,1]或$['store','other'],一次选取多个目标。
过滤表达式:?()
过滤用于按条件筛选数组元素或对象成员,写在 ?() 中,例如 $..book[?(@.price < 15)] 选出价格低于 15 的书。这里的 @ 代表当前正在判断的节点。
脚本表达式:()
括号内可写脚本表达式做进一步计算或取值,具体能力取决于所用实现的语言环境。
语法元素速查
| 元素 | 含义 |
|---|---|
$ |
根节点 |
. 或 [] |
访问成员 / 数组元素 |
* |
通配,匹配任意成员或元素 |
.. |
递归下降,跨层级查找 |
[start:end:step] |
数组切片 |
[a,b] |
并集,选取多个目标 |
?() |
过滤表达式 |
() |
脚本表达式 |
@ |
过滤或脚本中的当前节点 |
实现与获取方式
goessner.net 提供了 JSONPath 的轻量实现:jsonpath.js 用于客户端,jsonpath.php 用于服务端,页面说明可以免费下载。同一页面还提到 Atif Aziz 贡献了 C# 移植版 jsonpath.cs。不同语言、不同库对上述元素的覆盖范围可能不完全一致,实际使用时以所用实现的文档为准。
使用时的常见注意点
- 索引从 0 开始,与 XPath 的 1 起始位置不同,迁移表达式时要换算。
..递归下降在深层或大型结构上可能返回大量结果,也会带来性能开销,能确定层级时优先用具体路径。- 过滤表达式中的比较运算符和函数支持因实现而异,跨库移植前先验证。
- 路径表达式本身只负责“选取”,返回结果的形态(单个值、数组还是空)由实现决定,取值前应确认。
JSONPath 有哪些实现和下载资源?
JSONPath 最初由 Stefan Goessner 以轻量工具形式实现,提供 JavaScript 和 PHP 两个版本,分别用于客户端和服务器端访问 JSON 结构。这两个文件可以直接从 goessner.net 免费下载:jsonpath.js 和 jsonpath.php。此外,社区还出现了 C# 移植版本 jsonpath.cs,由 Atif Aziz 完成。
官方实现
goessner.net 是 JSONPath 的原始发布站点,作者在介绍 JSONPath 时同步提供了配套实现。
| 实现文件 | 语言 | 典型用途 |
|---|---|---|
jsonpath.js |
JavaScript | 在浏览器或 Node.js 等客户端环境解析 JSONPath 表达式 |
jsonpath.php |
PHP | 在服务器端对 JSON 结构执行路径查询 |
这两个文件被描述为“轻量工具”,用于在客户端和服务器端访问 JSON 结构。作者明确说明可以免费下载,并提供了进一步阅读的入口。
社区移植
在 JSONPath 发布后不久,Atif Aziz 贡献了 C# 版本 jsonpath.cs。作者在站点更新中特别致谢,说明该移植在很短时间内完成。
相关脚本与更新
goessner.net 的下载区还包含与 JSON 相关的其他脚本,例如 XML 与 JSON 互转的 xml2json.js 和 json2xml.js。作者提到这些脚本有若干 bug 修复和更新,并引导读者到下载区查看详情。
获取方式
- 直接访问 goessner.net,进入 Download 区域查找上述文件。
- 站点首页导航包含 Home、Lehre、Download、Info 等入口,下载资源集中在 Download 下。
- 页面未提及价格或登录限制,但也没有说明这些资源采用何种许可协议;如需商用或再分发,建议先确认授权条款。
如何在 XML 和 JSON 之间转换?
Stefan Goessner 在 XML.com 发表过一篇关于 XML 与 JSON 互相转换的文章,并提供了配套的转换脚本,包括 xml2json.js 和 json2xml.js。如果你需要在这两种数据格式之间迁移或做互操作,可以直接使用这套脚本,并在 goessner.net 的下载区获取后续的 bug 修复和更新版本。
转换脚本从哪里获取
根据 goessner.net 上的记录,转换脚本与文章配套发布,入口如下:
- 文章:XML.com 上发表的 Converting Between XML and JSON
- 脚本:
xml2json.js和json2xml.js - 更新:作者提到脚本有若干 bug 修复和更新,具体内容在网站的 download 区
也就是说,先看文章了解转换思路,再去下载区拿最新脚本,是这套资源的正常使用顺序。
两个方向分别对应什么
| 方向 | 脚本 | 输入 | 输出 |
|---|---|---|---|
| XML → JSON | xml2json.js |
XML 结构 | JSON 结构 |
| JSON → XML | json2xml.js |
JSON 结构 | XML 结构 |
两个脚本是独立文件,按你需要转换的方向选用即可,不需要同时引入。
适合用在什么场景
这套转换适合需要在两种数据格式之间迁移或互操作的场景,例如:
- 已有 XML 数据源,但下游程序更习惯处理 JSON
- 已有 JSON 配置或数据,但某个工具或接口只接受 XML
- 在浏览器端或服务端做格式适配时,需要一个轻量的转换脚本
使用时的注意点
- 脚本是 JavaScript 实现,运行环境需要支持 JavaScript。
- 作者明确提到脚本有过 bug 修复和更新,使用前建议先到下载区确认拿到的是较新版本,而不是早期副本。
- XML 与 JSON 的数据模型并不完全一一对应(例如属性、文本节点、数组的表示方式),转换结果是否符合预期,取决于你的具体数据结构,建议先用一小段代表性数据验证再批量使用。
和 JSONPath 的关系
同一网站还提供了 JSONPath,作者把它描述为“XPath for JSON”,用于在 JSON 结构中按路径表达式选取部分内容。如果你的流程是“先把 XML 转成 JSON,再从中取字段”,那么 xml2json.js 负责格式转换,JSONPath 负责在转换后的 JSON 里定位数据,两者可以配合使用。
goessner.net 是什么网站?
goessner.net 是 Stefan Goessner 的个人技术网站,副标题为“Mechanik, das Web und der ganze Rest”(机械、Web 以及其余的一切)。它主要发布技术文章和自研工具,内容集中在 Web 数据格式处理方向,尤其是 JSONPath 和 XML/JSON 转换。网站提供下载区,可获取相关脚本;从现有资料看,它属于个人技术博客/资料站,而非商业平台。
网站定位与维护者
- 维护者:Stefan Goessner。
- 主题范围:机械、Web 及其他技术话题。
- 内容形式:技术文章、工具发布、下载资源。
- 性质:个人技术站点,不是商业服务或产品官网。
主要收录内容
JSONPath:面向 JSON 的路径表达式
网站最常被引用的是 JSONPath。作者提出它的动机是:既然 XML 有 XPath 来选取节点,JSON 结构也应有类似的路径表达式语法,用于定位 JSON 中的部分数据。
JSONPath 的定位是:
- 一种路径表达式语法,像 XPath 选取 XML 节点那样选取 JSON 结构的部分内容。
- 语法元素基于 C 语言家族特征设计,只覆盖 XPath 1.0 的核心部分。
- 示例表达式
$..book[2].title,对应 XPath 的//book[3]/title。
作者当时给出的实现是轻量工具,分别用 JavaScript 和 PHP 编写,用于在客户端和服务器端访问 JSON 结构,并提供 jsonpath.js、jsonpath.php 下载。页面还记录了一个后续更新:Atif Aziz 很快贡献了 C# 移植版 jsonpath.cs。
XML 与 JSON 相互转换
网站还收录了作者发布在 XML.com 上的文章《Converting Between XML and JSON》,并配套提供转换脚本。页面提到 xml2json.js 和 json2xml.js 有缺陷修复与更新,更多内容在下载区。
其他技术记录
站内还包含会议与活动记录,例如作者参加阿姆斯特丹 XTech 2006 的见闻,包括 Ajax Developers' Day、Brendan Eich 关于“JavaScript 2 and the Future of the Web”的闭幕演讲,以及关于 Web Component Model 的文章。
适合谁访问
- 需要了解 JSONPath 起源、语法设计思路的人。
- 想获取
jsonpath.js、jsonpath.php、jsonpath.cs或 XML/JSON 转换脚本的开发者。 - 对早期 Web 技术讨论、XTech 2006 等会议内容感兴趣的技术读者。
需要注意
- 网站内容带有明显的个人项目和时间印记,部分文章可追溯到 2006 年前后。
- 下载资源的具体可用性、版本状态和许可条款,需以站内下载区当前说明为准。
- 它不是 JSONPath 的官方标准站点,而是该工具早期提出与发布的个人来源之一。
网站信息概览
从公开技术信号来看,长期注册记录并非孤立存在,基础设施也有专业服务支撑,因此更可能具备稳定维护流程,而非一次性部署。从当前可见信息判断,当规范链接、描述或分享字段共同不足时,搜索平台更依赖自行推断,可能出现摘要偏题、图片缺失或权重分散。
域名与注册信息
域名最早登记于 2001 年,注册历史相对较长。状态中包含防转移保护,未发现 hold 或删除流程标记。该网站采用常见域名后缀 .net。
DNS 与邮件配置
现有迹象表明,名称服务器由 ui-dns.biz 提供,使用专业 DNS 托管。从公开技术信号来看,该域名的收件服务由 IONOS Mail 提供。未发现 CNAME,当前记录直接解析到地址。可见邮件策略包含 SPF 和 DMARC,DKIM 是否启用尚待进一步确认。RDAP 将 DNSSEC 标记为未签名。
TLS 与证书
综合当前可观察字段,HTTPS 证书来自 Sectigo Limited 商业证书服务。RSA 密钥长度为 2048 位,符合当前常见配置。TLS 握手提供了完整的证书链数据。证书未包含组织名称,按现有字段归为 DV 域名验证证书。从当前可见信息判断,证书总有效期约 379 天,剩余 17 天。
HTTP 响应
未检测到常用浏览器安全响应头。未发现 X-Powered-By,后端框架信息未通过该字段公开。HTTP 字段未显示敏感内部网络标识。HTTP Server 字段已隐藏详细版本。HTTP 响应没有提供边缘代理证据。
技术栈分析
现有迹象表明,本次识别到 Blogger、Apache,具体版本为未知。信息暴露面比直接公开版本更小,实际风险仍取决于生产环境采用的版本和配置。
SEO 与社交分享
首页未检测到 Meta Description。CMS 或生成器信息通过元标签可见。页面未检测到 Viewport 元标签。页面没有声明首选 URL。首页没有专门配置社交平台分享信息。
主机和电子邮件
页面、搜索与分享信息
| 页面描述 | 未检测到 |
|---|---|
| 规范链接 | 未检测到 |
| 语言 | 未知(默认) |
| Twitter Card | 未检测到 |
未知
robots.txt (在新窗口打开)
HTTP 404未发现 robots.txt
Sitemaps
0暂未发现 Sitemaps
域名登记事实 RDAP / WHOIS
| 注册商 | IONOS SE |
|---|---|
| 注册时间 | 2001-03-03 |
| 到期时间 | 2027-03-03 |
| 域名状态 | client transfer prohibited |
| 名称服务器 | ns1104.ui-dns.biz、ns1104.ui-dns.com、ns1104.ui-dns.de、ns1104.ui-dns.org |
| DNSSEC | unsigned |
DNS 记录
| 类型 | 名称 | 值 | TTL | 优先级 |
|---|---|---|---|---|
| A | goessner.net | 217.160.0.187 | 508 | — |
| AAAA | goessner.net | 2001:8d8:100f:f000::2a8 | 2283 | — |
| MX | goessner.net | mx00.ionos.de | 3600 | 10 |
| MX | goessner.net | mx01.ionos.de | 3600 | 10 |
| NS | goessner.net | ns1104.ui-dns.biz | 172800 | — |
| NS | goessner.net | ns1104.ui-dns.com | 172800 | — |
| NS | goessner.net | ns1104.ui-dns.de | 172800 | — |
| NS | goessner.net | ns1104.ui-dns.org | 172800 | — |
| TXT | goessner.net | v=spf1 include:_spf-eu.ionos.com ~all | 3600 | — |
| DMARC | _dmarc.goessner.net | v=DMARC1;p=reject;rua=mailto:[email protected] | 3600 | — |
TLS 与证书
| 定性结果 | 配置正常 |
|---|---|
| 支持协议 | TLSv1.2、TLSv1.3 |
| 协商协议 | TLSv1.3 |
| 证书主题 | *.goessner.net |
| 颁发者 | Sectigo Limited |
| 有效期至 | 2026-10-27T23:59 · 记录时剩余 17 天 |
| 验证事实 | 证书信任:通过 · 域名匹配:通过 |
HTTP 响应标头
| 标头 | 值 |
|---|---|
| content-type | text/html |
| server | Apache |
已识别技术
最近更新
- 网站图像资源
- 页面截图
- 网络归属信息
- 网站技术
- 页面与搜索信息
- HTTP 响应信息
- TLS 与证书
- DNS 信息
- 域名登记信息
- 网站名称
- 网站资料
- 网站简介
- 网站名称
用户评价(0)