【发布时间】: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”的复杂类型元素并仅使用<xs:element type="xs:int" name="totals"/> 时,我将获得除元素名称“totals”之外的所有属性的值。这显示为 null。
这意味着我可以获取 JSON 数组“元素”的数据,但不能获取“总计”的数据。 如我所见,我的问题仅在于没有名称的“普通”JSON 数组,因为我无法将它们绑定到具有相同名称的 XS 元素。
如果我要编写代码,我会尝试从 totals[0] 中获取值,但我无法控制该工具如何解析来自服务器的 JSON 响应。但是,由于我能够获取所有属性的值(也来自其他使用名称/键的 JSON 数组),我想有一种方法也可以使其适用于“普通”JSON 数组。
谁能告诉我如何处理 XSD 中的那些 JSON 数组?
谢谢。
【问题讨论】:
-
提供中间 XML 会很有用。 JSON 和 XML 之间没有完全标准的映射,因为有不同的方法(有些已记录在案)。这意味着总体而言,有许多有意义的方式可以映射输入 JSON 并对照 XML Schema 进行检查,并且没有一个比另一个更“正确”或“错误”。此外,ETL 工具可能会记录它使用的映射,如果没有这些文档,很难提供准确的答案。
-
感谢您的回复。我在网上尝试的一个格式化程序为我的“总计”数组创建了这个 xml:
<totals><element>51245123</element></totals>另一个,在没有子元素的情况下给我同样的:<totals>51245123</totals>我找不到与我的工具映射相关的任何文档,但我已经和他们一起开了一张支持票,看看他们是否愿意帮助我。 -
确实,在第一种情况下,它是一种复杂类型,您的原始模式应该可以工作。在第二种情况下,它是一个简单的类型,然后我的替代建议应该可以工作。如果这些都不起作用,则该工具可能正在使用另一个映射。