JSON是否有等价的XSLT ?它允许我对JSON进行转换,就像XSLT对XML所做的那样。


当前回答

可以将XSLT与JSON结合使用。 XPath(3.1)、XSLT(3.0)和XQuery(3.1)的Verson 3在某种程度上支持JSON。 这似乎在Saxon的商业版本中可用,并且可能在某个时候包含在HE版本中。 https://www.saxonica.com/html/documentation/functions/fn/parse-json.html

-

我对另一种解决方案的期望是:

我想要能够输入JSON获取一组匹配的数据,并输出JSON或文本。

访问任意属性并计算值

支持条件逻辑

我希望转换脚本来自于工具的外部,基于文本,最好是一种常用的语言。

潜在的替代吗?

我想知道SQL是否是一个合适的选择。 https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

如果替代工具能够处理JSON和XML就太好了 https://learn.microsoft.com/en-us/sql/relational-databases/xml/openxml-sql-server

我还没有尝试将我使用的XSLT脚本转换为SQL,也没有完全评估这个选项,但我希望很快就会研究它。目前只是一些想法。

其他回答

说缺乏工具就意味着缺乏需求,这只是在回避问题。这同样适用于Linux中的X或Y支持(为什么要为这样一个少数操作系统开发高质量的驱动程序和/或游戏呢?为什么要关注一个大型游戏和硬件公司不会开发的操作系统?)可能需要使用XSLT和JSON的人最终会使用一种有点琐碎的解决方法:将JSON转换为XML。但这不是最优解,对吧?

当您有一个原生JSON格式,并且希望在浏览器中以“所见即所得”的方式编辑它时,XSLT将是一个非常合适的解决方案。用传统的javascript编程来实现这一点可能会让人头疼。

事实上,我已经实现了一种“石器时代”的XSLT方法,使用子字符串解析来解释javascript的一些基本命令,比如调用模板、子进程等。当然,使用JSON对象实现转换引擎要比实现成熟的XML解析器来解析XSLT容易得多。问题是,要使用XML模板转换JSON对象,您需要解析模板的XML。

要将JSON对象转换为XML(或HTML、文本或其他内容),您需要仔细考虑语法以及需要使用哪些特殊字符来标识转换命令。否则,您将不得不为自己的自定义模板语言设计一个解析器。走过这条路后,我可以告诉你,它并不漂亮。

Update (Nov 12, 2010): After a couple of weeks working on my parser, I've been able to optimize it. Templates are parsed beforehand and commands are stored as JSON objects. Transformation rules are also JSON objects, while the template code is a mix of HTML and a homebrew syntax similar to shell code. I've been able to transform a complex JSON document into HTML to make a document editor. The code is around 1K lines for the editor (it's for a private project so I can't share it) and around 990 lines for the JSON transformation code (includes iteration commands, simple comparisons, template calling, variable saving and evaluation). I plan to release it under a MIT license. Drop me a mail if you want to get involved.

有关利用纯JavaScript的方法以及XSLT匹配表达式和递归模板背后熟悉的声明式模式的工作演示/概念证明,请参见https://gist.github.com/brettz9/0e661b3093764f496e36

(JSON也可以采用类似的方法。)

注意,为了方便在Firefox中表达模板,演示还依赖于JavaScript 1.8表达式闭包(至少在实现方法的ES6简写形式之前是如此)。

免责声明:这是我自己的代码。

现在有了!我最近创建了一个库,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属性的对象,输出模型和年份属性。最后一个是递归匹配的恒等变换。

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语法和完整的规范描述的。

JSONiq就是这样一个标准,而Zorba是一个开源的c++实现。JSONiq也可以看作是添加了JSON作为原生数据类型的XQuery。