WSO2 XML转JSON问题:单Coll元素强制转为数组
在WSO2中实现XML转JSON时强制单个
<ban:Coll>为数组 方法一:自定义XSLT预处理XML
核心思路是先将XML中单个的<ban:Coll>元素包装为节点集合,再执行JSON转换,确保结果为数组结构。
假设原XML结构如下:
<Result xmlns:ban="http://example.com/ban"> <ban:Coll> <Item>1</Item> </ban:Coll> </Result>
对应的XSLT脚本:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ban="http://example.com/ban"> <!-- 默认复制所有节点与属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配Result节点,处理ban:Coll --> <xsl:template match="Result"> <Result> <!-- 用临时容器包裹所有ban:Coll节点 --> <xsl:element name="CollContainer"> <xsl:apply-templates select="ban:Coll"/> </xsl:element> <!-- 保留Result下的其他节点 --> <xsl:apply-templates select="node()[not(self::ban:Coll)]"/> </Result> </xsl:template> <!-- 保留ban:Coll的原始结构 --> <xsl:template match="ban:Coll"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
在WSO2 Sequence中先通过XSLT Mediator执行上述转换,再用JSON转换Mediator处理预处理后的XML,最后可通过PayloadFactory将CollContainer重命名为Coll,最终得到Result.Coll数组。
方法二:Script Mediator(JavaScript)直接处理对象
通过JS将XML转为对象后,手动强制Coll字段为数组,再转回JSON:
// 获取当前消息的XML payload var xmlPayload = mc.getPayloadXML(); // 转换为JS对象 var jsonObj = xmlPayload.toJSON(); // 检查并处理Coll字段 if (jsonObj.Result && jsonObj.Result["ban:Coll"]) { var collData = jsonObj.Result["ban:Coll"]; // 非数组则包装为数组 if (!Array.isArray(collData)) { jsonObj.Result["ban:Coll"] = [collData]; } } // 将处理后的对象设置为消息payload mc.setPayloadJSON(jsonObj);
注意:需根据XML命名空间确保键名引用正确,比如带前缀的"ban:Coll"。
方法三:配置WSO2 JSON转换强制数组属性
利用WSO2自带的转换属性,无需修改XML结构即可指定节点转为数组:
在Sequence中添加Property Mediator,设置:
- Name:
org.apache.synapse.commons.json.JsonBuilder.force.array - Value:
ban:Coll - Scope:
axis2
后续执行XML转JSON操作时,无论<ban:Coll>是单个还是多个,都会被转为数组。如需指定多个节点,可用逗号分隔,例如ban:Coll,OtherNode。
内容的提问来源于stack exchange,提问作者Noman Khan
相关产品推荐
相关产品推荐

