JSON是否有等价的XSLT ?它允许我对JSON进行转换,就像XSLT对XML所做的那样。
当前回答
现在有了!我最近创建了一个库,json-transforms,正是为了这个目的:
https://github.com/ColinEberhardt/json-transforms
它结合使用了JSPath(一种模仿XPath的DSL)和一种直接受到XSLT启发的递归模式匹配方法。
这里有一个简单的例子。给定以下JSON对象:
const json = {
"automobiles": [
{ "maker": "Nissan", "model": "Teana", "year": 2011 },
{ "maker": "Honda", "model": "Jazz", "year": 2010 },
{ "maker": "Honda", "model": "Civic", "year": 2007 },
{ "maker": "Toyota", "model": "Yaris", "year": 2008 },
{ "maker": "Honda", "model": "Accord", "year": 2011 }
]
};
这是一个变换:
const jsont = require('json-transforms');
const rules = [
jsont.pathRule(
'.automobiles{.maker === "Honda"}', d => ({
Honda: d.runner()
})
),
jsont.pathRule(
'.{.maker}', d => ({
model: d.match.model,
year: d.match.year
})
),
jsont.identity
];
const transformed = jsont.transform(json, rules);
输出如下:
{
"Honda": [
{ "model": "Jazz", "year": 2010 },
{ "model": "Civic", "year": 2007 },
{ "model": "Accord", "year": 2011 }
]
}
这个转换由三个规则组成。第一个匹配本田制造的任何汽车,发出一个具有Honda属性的对象,然后递归匹配。第二条规则匹配任何具有maker属性的对象,输出模型和年份属性。最后一个是递归匹配的恒等变换。
其他回答
JSONiq就是这样一个标准,而Zorba是一个开源的c++实现。JSONiq也可以看作是添加了JSON作为原生数据类型的XQuery。
CsvCruncher
尽管它的名字并不暗示它,CsvCruncher可以有效地用于读取表格* JSON数据,并使用SQL处理它们。
* Tabular表示JSON树的某些部分是规则的,即一个到多个相同或相似结构的条目。
CsvCruncher将树的这一部分转换为SQL表,然后您就有了完整的SQL语法来查询它。 您还可以加载多个JSON树,然后使用多个表。 您还可以将SQL结果存储为JSON(或CSV),然后再次处理它。
与真正复杂的XSLT方法相比,这种方法对我的帮助更大(尽管当您真正深入了解它时,它非常有趣)。
免责声明:我是CsvCruncher的开发者。
有关利用纯JavaScript的方法以及XSLT匹配表达式和递归模板背后熟悉的声明式模式的工作演示/概念证明,请参见https://gist.github.com/brettz9/0e661b3093764f496e36
(JSON也可以采用类似的方法。)
注意,为了方便在Firefox中表达模板,演示还依赖于JavaScript 1.8表达式闭包(至少在实现方法的ES6简写形式之前是如此)。
免责声明:这是我自己的代码。
我使用骆驼路由marshal(xmljson) ->到(xlst) -> marshal(xmljson)。足够高效(虽然不是100%完美),但简单,如果你已经在使用Camel。
JSON的XSLT等价物——候选工具(工具和规范)列表
工具
1. XSLT
您可以将XSLT用于JSON,目的是实现fn: JSON -to-xml。
本节描述允许使用XSLT处理JSON数据的功能。
2. 金桥
jq就像JSON数据的sed一样——你可以用它来切片、过滤、映射和转换结构化数据,就像sed、awk、grep和其他一些朋友让你处理文本一样简单。 不同操作系统有不同的安装包。
3. jj
JJ是一个命令行实用程序,提供了从JSON文档检索或更新值的快速而简单的方法。它在底层由GJSON和SJSON提供支持。
4. 外汇
命令行JSON处理工具 不需要学习新的语法 纯JavaScript 格式和高亮显示 独立的二进制
5. CsvCruncher
基于sql的命令行表格数据处理工具 不需要学习新的语法 适用于JSON包含具有相似项的大型数组时 支持将多个文档作为多个SQL表处理 用Kotlin编写,在Java上运行 也可以作为Java库在Maven Central存储库中使用
6. jl
jl(“JSON lambda”)是一种用于查询和操作JSON的小型函数式语言。
7. 震动
用Java编写的JSON到JSON转换库,其中转换的“规范”本身就是一个JSON文档。
8. gron
使JSON易于获取! gron将JSON转换为离散的赋值,以便更容易地grep您想要的内容,并查看它的绝对“路径”。它简化了对返回大量JSON但文档糟糕的api的探索。
9. json-e
JSON-e是一个数据结构参数化系统,用于在JSON对象中嵌入上下文。 其核心思想是将数据结构视为“模板”,并使用另一个数据结构作为上下文对其进行转换,以产生输出数据结构。
10. JSLT
JSLT是一种完整的JSON查询和转换语言。语言设计的灵感来自jq、XPath和XQuery。
11. JSONata
JSONata是用于JSON数据的轻量级查询和转换语言。受到XPath 3.1的“位置路径”语义的启发,它允许用紧凑而直观的符号表示复杂的查询。
12. JSONPath多
分析、转换和选择性地从JSON文档(和JavaScript对象)中提取数据。 Jsonpath-plus扩展了原始规范,添加了一些额外的操作符,并显式地显示了原始规范没有阐明的一些行为。
13. 2017年12月1日
提供一种递归的模式匹配方法来转换JSON数据。转换被定义为一组匹配JSON对象结构的规则。当发生匹配时,规则发出转换后的数据,可选地递归转换子对象。
14. 最后提交2018年6月23日
json是一个使用json的快速CLI工具。它是一个单文件node.js脚本,没有外部deps(除了node.js本身)。
15. jsawk最后提交2015年3月4日
Jsawk类似于awk,但用于JSON。您使用从stdin读取的JSON对象数组,使用JavaScript对它们进行过滤,生成输出到stdout的结果数组。
16. 2017年3月13日
测试可以作为文档https://github.com/pasaran/yate/tree/master/tests使用
17. jsonpath-object-transform最后提交2017年1月18日
使用JSONPath从对象文字中提取数据,并基于模板生成一个新对象。
18. 装订最后提交2013年9月16日
Stapling是一个JavaScript库,支持JSON对象的XSLT格式。 与使用JavaScript模板引擎和文本/html模板不同,Stapling让您有机会使用XSLT模板(使用Ajax异步加载,然后在客户端缓存)来解析JSON数据源。
规格:
Json指针
JSON Pointer定义了用于标识特定值的字符串语法 在JavaScript对象表示法(JSON)文档中。
JsonPath
JSONPath表达式总是引用JSON结构,就像XPath表达式与XML文档结合使用一样
JSPath
JSPath for JSON就像XPath for XML。”
JSONiq
JSONiq背后的主要灵感来源是XQuery,到目前为止,它已被证明是一种用于半结构化数据的成功且高效的查询语言
杰梅斯帕斯
JMESPath是一种JSON的查询语言。JMESPath语言是用ABNF语法和完整的规范描述的。
推荐文章
- 从JSON生成Java类?
- 使用Jackson将Java对象转换为JSON
- Javascript对象Vs JSON
- 在Swift中将字典转换为JSON
- 如何使用新的PostgreSQL JSON数据类型中的字段进行查询?
- 将类实例序列化为JSON
- JSON和对象文字表示法的区别是什么?
- 是否有与XQuery/XPath等价的JSON ?
- 对bash脚本函数中定义的变量使用curl POST
- 从Json转换为类型数组列表<T>
- REST API最佳实践:查询字符串中的参数vs请求体中的参数
- 打印JSON解析对象?
- JSON有查询语言吗?
- 无法加载文件或程序集'Newtonsoft。Json或其依赖项之一。清单定义与程序集引用不匹配
- 错误:不允许匹配“[xX][mM][lL]”的处理指令目标