WSO2, XML 到 JSON, 强制将单个元素视为数组

WSO2, XML to JSON, force a single element to be treated as array

在 Enterprise Integrator 6.6.0 中,我正在将 XML 转换为 JSON 有效负载。

如果 XML 源只有一个元素,它显然会被视为一个对象

<items>
 <item></item>
</items>

变成

{
    "items": {
        "item": {}
    }
}

但如果元素较多,则将具体对象作为数组处理

<items>
 <item></item>
 <item></item>
</items>

变成

{
    "items": {
        "item": [{}, {}]
    }
}

有没有办法对齐特定子对象的转换?在这种情况下,我试图始终 return 一个项目数组,即使只有一个元素也是如此。

我读到了 xml-multiple 属性 但我不明白如何使用它;是否要手动设置为来源 xml 有效负载?

您可以像下面这样组合 filterMediatorenrichMediator。如果没有第二项:

  1. 例如将 <item> 元素存储为 ONE_ITEM,
  2. <?xml-multiple item?>
  3. 构建<items>节点
  4. 用存储的 ONE_ITEM.
  5. 丰富新的 <items> 对象

我不知道注入 <?xml-multiple item?> XML 处理指令的更好选择。 像下面这样的东西对我有用。

      <filter xmlns:ns="http://org.apache.synapse/xsd" xpath="not(//item[2])">
        <then>
          <enrich>
            <source clone="false" xpath="//item"/>
            <target type="property" property="ONE_ITEM"/>
          </enrich>
          <enrich>
            <source type="inline" clone="false">
              <items xmlns="">
                <?xml-multiple item?>
              </items>
            </source>
            <target xpath="//items"/>
          </enrich>
          <enrich>
            <source type="property" clone="false" property="ONE_ITEM"/>
            <target action="child" xpath="//items"/>
          </enrich>
        </then>
        <else/>
      </filter>
      <property name="messageType" value="application/json" scope="axis2"/>

您可以使用 Json 转换中介[1] 来实现您的用例。这里我们需要定义 json 模式来匹配预期的数据结构。对于上述情况,您将能够使用类似于以下的 json 模式。

 {
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "items": {
      "type": "object",
      "properties": {
        "item": {
          "type": "array",
          "items": [
            {
              "type": "object"
            }
          ]
        }
      },
      "required": [
        "item"
      ]
    }
  },
  "required": [
    "items"
  ]
}

这指定该项目是一个数组。然后可以将模式添加到注册表 [2] 并在 json 转换中介中引用。在 xml 到 json 转换之后需要添加 Json 转换中介。请参考以下示例代理服务。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="transform"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <property name="messageType" scope="axis2" value="application/json"/>
         <property name="ContentType" scope="axis2" value="application/json"/>
         <jsontransform schema="conf:/schema.json"/>
         <respond/>
      </inSequence>
   </target>
   <description/>
</proxy>
           

输入 1

<items>
 <item><val1></val1></item>
 <item><val1></val1></item>
</items>

输出 1

{
    "items": {
        "item": [
            {
                "val1": null
            },
            {
                "val1": null
            }
        ]
    }
}
        

输入 2

<items>
 <item><val1></val1></item>
</items>

输出 2

{
    "items": {
        "item": [
            {
                "val1": null
            }
        ]
    }
}

[1]-https://docs.wso2.com/display/EI660/JSON+Transform+Mediator

[2]-https://docs.wso2.com/display/EI660/Managing+the+Registry+

您可以通过在邮件中添加 <xsl:processing-instruction name="xml-multiple">item</xsl:processing-instruction> 来使用 XSLT 转换来完成此操作。