【问题标题】:Does JSON to XML lose me anything?JSON to XML 有什么损失吗?
【发布时间】:2020-08-09 19:30:01
【问题描述】:

我们有一个程序可以接受 XML、JSON、SQL、OData 等数据。对于 XML,我们使用 Saxon 及其 XPath 支持,效果非常好。

对于 JSON,我们使用 jsonPath library,它不如 XPath 3.1 强大。并且 jsonPath 在某些极端情况下有点松鼠。

那么...如果我们将获得的 JSON 转换为 XML 然后使用 Saxon 会怎样?这种方法有限制吗?是否存在不会转换为 XML 的 JSON 结构,例如匿名数组?

【问题讨论】:

  • 你问:那么...如果我们将得到的 JSON 转换为 XML 然后使用 Saxon 会怎样? 但是也可以选择在 Saxon 中将其处理为 JSON,无需转换为 XML。 XPath 3.1 中的 parse-json() 函数将为您提供可以在 XPath 中本地处理的映射和数组结构。

标签: json xpath saxon jsonpath xpath-3.1


【解决方案1】:

标题问题:XPath 3.1 中的json-to-xml() 函数是无损的,除了默认情况下,XML 中无效的字符(例如 NUL,或不成对的代理)被替换为 SUB 字符——你可以改变这个使用选项 escape=true 的行为。

为了方便,我们以一定的代价实现了无损。例如,JSON 属性名称不会转换为 XML 元素或属性名称,而是转换为 key 属性的值。

【讨论】:

    【解决方案2】:

    许多不同的人提出了许多不同的 JSON 到 XML 的转换。正如已经指出的那样,XPath 3.1 和 XSLT 3.0 规范具有可以处理任何 JSON 的json-to-xmlxml-to-json 的无损往返转换。

    有一些更简单的转换可以处理有限的 JSON 集,主要问题是如何表示不映射到 XML 名称的 JSON 的属性名称,例如{ "prop 1" : "value" }json-to-xml 表示为 <string key="prop 1">value</string>,而尝试将属性名称映射到元素或属性名称的转换要么无法创建格式正确的 XML(例如 <prop 1>value</prop 1>),要么必须转义元素中的空格名称(例如 <prop_1>value</prop_1> 或插入空间的 Unicode 的一些十六进制表示)。

    最后我猜你想在{ "foo" : "value" }中选择属性foo作为foo,简单的转换会给你;在 XPath 3.1 中,您需要 ?foo 用于 XDM 映射或 fn:string[@key = 'foo'] 用于 json-to-xml 结果格式。

    如果{ "prop 1" : "value" } 后一种仍保留为fn:string[@key = 'prop 1'],则需要将? 方法更改为?('prop 1').('prop 1')。任何在元素名称中转义空格的转换都需要您将路径更改为例如prop_1.

    我认为对于所有类型的 JSON 都没有理想的方法,最终它取决于您期望的 JSON 格式以及用户学习新的选择/查询方法的意愿或时间。

    当然,您可以使用除json-to-xml 之外的其他 JSON 到 XML 转换,然后在任何 XML 格式上使用 XPath 3.1;我认为这就是 oXygen 人所选择的,他们在 XPath 3.1 提供之前进行了一些 JSON 到 XML 的转换,并且主要坚持使用它,所以在 oXygen 中,您可以针对 JSON 编写“路径”表达式,因为路径是在引擎盖下被评估的针对 JSON 的 XML 转换。我不确定在 XML 格式中的 XPath 路径表达式选择了原始 JSON 中的哪些 JSON 值需要付出哪些努力,这可能不是那么容易和直接。

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2011-08-06
      • 2018-08-03
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多