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 有效负载?
您可以像下面这样组合 filterMediator
和 enrichMediator
。如果没有第二项:
- 例如将
<item>
元素存储为 ONE_ITEM
,
- 用
<?xml-multiple item?>
、 构建<items>
节点
- 用存储的
ONE_ITEM
. 丰富新的 <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 转换来完成此操作。
在 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 有效负载?
您可以像下面这样组合 filterMediator
和 enrichMediator
。如果没有第二项:
- 例如将
<item>
元素存储为ONE_ITEM
, - 用
<?xml-multiple item?>
、 构建 - 用存储的
ONE_ITEM
. 丰富新的
<items>
节点
<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 转换来完成此操作。