【问题标题】:How to convert JSON array to XML element for WADL如何将 JSON 数组转换为 WADL 的 XML 元素
【发布时间】:2017-09-30 02:11:15
【问题描述】:

我正在尝试从 Web 服务中检索数据,而专有的 ETL 工具(我必须使用)需要一个 .WADL 文件来连接到 REST 服务。

到目前为止,我已经在 SOAP UI 的帮助下从 API 端点创建了一个 .WADL 文件,然后我将架构定义(用于响应)放在了 <grammars> </grammars> 标记之间。为此,我已将预期的 JSON 输出从 Web 服务转换为 XML,然后在在线格式化程序的帮助下转换为 XSD。

这适用于大多数原始 JSON 元素,但是当元素是 JSON 数组(没有名称)时,我的 ETL 工具无法解析该值。

为了说明,来自 Web 服务的输出看起来与此类似(我稍微缩短了输出):

{
   "report":    {
      "type": "overtime",
      "elements": [      {
         "id": "datetime",
         "name": "Date"
      }],
      "totals": ["51245123"]
   }
}

然后 XSD 看起来像这样(在我已经删除了一些名为“element”的不需要的元素之后,在线转换器将它们放在那里作为原始 JSON 数组的替代品(例如“elements”)):

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="report">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="elements">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="id"/>
                    <xs:element type="xs:string" name="name"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="totals">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:int" name="element"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element type="xs:string" name="type"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我在 .WADL 文件中使用上述 XSD 时,由于不匹配,我的工具在解析“totals”元素时失败。 当我删除名为“element”的复杂类型元素并仅使用&lt;xs:element type="xs:int" name="totals"/&gt; 时,我将获得除元素名称“totals”之外的所有属性的值。这显示为 null。

这意味着我可以获取 JSON 数组“元素”的数据,但不能获取“总计”的数据。 如我所见,我的问题仅在于没有名称的“普通”JSON 数组,因为我无法将它们绑定到具有相同名称的 XS 元素。

如果我要编写代码,我会尝试从 totals[0] 中获取值,但我无法控制该工具如何解析来自服务器的 JSON 响应。但是,由于我能够获取所有属性的值(也来自其他使用名称/键的 JSON 数组),我想有一种方法也可以使其适用于“普通”JSON 数组。

谁能告诉我如何处理 XSD 中的那些 JSON 数组?

谢谢。

【问题讨论】:

  • 提供中间 XML 会很有用。 JSON 和 XML 之间没有完全标准的映射,因为有不同的方法(有些已记录在案)。这意味着总体而言,有许多有意义的方式可以映射输入 JSON 并对照 XML Schema 进行检查,并且没有一个比另一个更“正确”或“错误”。此外,ETL 工具可能会记录它使用的映射,如果没有这些文档,很难提供准确的答案。
  • 感谢您的回复。我在网上尝试的一个格式化程序为我的“总计”数组创建了这个 xml:&lt;totals&gt;&lt;element&gt;51245123&lt;/element&gt;&lt;/totals&gt; 另一个,在没有子元素的情况下给我同样的:&lt;totals&gt;51245123&lt;/totals&gt; 我找不到与我的工具映射相关的任何文档,但我已经和他们一起开了一张支持票,看看他们是否愿意帮助我。
  • 确实,在第一种情况下,它是一种复杂类型,您的原始模式应该可以工作。在第二种情况下,它是一个简单的类型,然后我的替代建议应该可以工作。如果这些都不起作用,则该工具可能正在使用另一个映射。

标签: json xml rest xsd


【解决方案1】:

由于我今天感觉很幸运,我仍然建议为 totals 元素尝试一下:

<xs:element name="totals" type="xs:string"/>

或者如果工具可以处理演员表:

<xs:element name="totals" type="xs:int"/>

(看看elements数组映射到XML的方式,似乎简单类型比复杂类型更适合totals)。

【讨论】:

  • 我尝试了&lt;xs:element name="totals" type="xs:string"/&gt;&lt;xs:element name="totals" type="xs:int"/&gt; 而不是复杂元素“totals”,但结果为空/空。使用您的解决方案,元素“总计”的描述将与元素“类型”的描述相同。但是“type”是一个字符串,“totals”是一个具有整数值的数组。我如何在 XML 中区分它?
  • 这是一个很好的观点,同样适用于elements 数组:似乎映射认为一个对象和包含该对象的数组是等效的,即映射不是无损的.因此,我猜测totals 也可能如此。我认为向工具团队开票是最好的做法,因为您依赖于他们的映射并且需要了解它是如何完成的。
猜你喜欢
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2019-04-25
  • 2021-08-11
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多