如何在WSO2 EI中将XML响应转换为指定格式的JSON数组
解决WSO2 Integration Studio 7.2中XML转合并JSON数组的问题
问题场景
你的XML响应包含多个<fields>节点,每个节点下有<listItems>,默认设置messageType=application/json后会生成多个独立JSON对象,但你需要将所有<listItems>的内容合并到同一个JSON数组中。
可行解决方案
方案1:先通过XSLT调整XML结构,再转JSON
先用XSLT Mediator把XML中分散的<listItems>合并为统一节点,再转换为JSON。
步骤:
- 创建XSLT文件(比如
merge-listitems.xsl),内容如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <result> <mergedListItems> <!-- 遍历所有fields下的listItems节点,复制其所有子内容 --> <xsl:for-each select="//fields/listItems/*"> <xsl:copy-of select="."/> </xsl:for-each> </mergedListItems> </result> </xsl:template> </xsl:stylesheet>
- 在序列中添加XSLT Mediator,引用上述XSLT文件。
- 后续添加Property Mediator,设置
name=messageType,value=application/json,即可得到合并后的JSON数组。
方案2:使用DataMapper Mediator自定义映射
通过DataMapper直接定义源XML到目标JSON的映射规则,强制将所有<listItems>合并为一个数组。
步骤:
- 新建Data Mapping资源:
- 导入源XML的Schema(可直接从XML示例生成)
- 定义目标JSON的Schema,比如:
{ "type": "object", "properties": { "mergedList": { "type": "array", "items": { "type": "string" } } } }
- 在映射界面,将源XML的
//fields/listItems/*节点批量映射到目标JSON的mergedList数组元素。 - 在序列中添加DataMapper Mediator,选择你创建的映射配置。
方案3:用Script Mediator写Groovy脚本直接处理
通过脚本直接解析XML并构建目标JSON,灵活性更高。
示例Groovy脚本:
import groovy.json.JsonBuilder import org.apache.commons.io.IOUtils import org.w3c.dom.Document import javax.xml.parsers.DocumentBuilderFactory // 读取输入XML payload def xmlContent = IOUtils.toString(inputStream) def docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() def xmlDoc = docBuilder.parse(new ByteArrayInputStream(xmlContent.getBytes())) // 提取所有listItems下的<item>节点内容(可根据实际XML结构调整) def itemNodes = xmlDoc.getElementsByTagName("item") def itemArray = [] for (int i = 0; i < itemNodes.length; i++) { itemArray.add(itemNodes.item(i).textContent) } // 构建目标JSON def jsonOutput = new JsonBuilder() jsonOutput { mergedList itemArray } // 设置输出payload和消息类型 message.setPayloadContent(jsonOutput.toString()) message.setProperty("messageType", "application/json")
将上述脚本添加到Script Mediator中,替换原来的JSON Transformer即可。
注意事项
- 如果你的
<listItems>是复杂对象(而非单一文本节点),只需调整XSLT或脚本中的处理逻辑,比如复制整个<listItems>节点或构建对象数组。 - JSON Transformer仅做XML到JSON的直接结构转换,不支持节点合并,所以需要先调整结构或用脚本直接生成目标JSON。
内容的提问来源于stack exchange,提问作者Mehrnoosh
相关产品推荐
相关产品推荐

