WSO2解析含冒号键的JSON时出现解析异常的问题求助
解决WSO2中处理含冒号键、逗号/数组值JSON的PayloadFactory异常问题
我之前在WSO2 EI/ESB中处理特殊结构JSON时踩过完全一样的坑——尤其是键包含冒号、值带逗号或数组格式字符串的场景,PayloadFactory的默认配置很容易触发各种解析异常。下面结合你的问题分析根源,给出亲测有效的解决方案:
问题根源分析
你的几个报错本质都是WSO2在JSON和XML互转时的语法冲突:
- 用
evaluator="xml"时报错:WSO2会把JSON转成OM(XML对象模型)元素,键里的冒号会被误判为XML命名空间前缀(比如foo:bar会被当成foo命名空间下的bar元素),但你没有声明这个命名空间,所以触发Undeclared namespace prefix错误。 - 给$1加引号时报错:此时整个JSON字符串会被当成普通字符串处理,Staxon解析器会尝试把它当成XML解析,自然会遇到非法字符(比如JSON里的
{、f等不符合XML语法的字符)。 - 用
evaluator="json"时报错:解析器会把值里的逗号或数组字符串(比如"[0,0,0]")当成JSON语法的一部分,误判为结构分隔符,触发Unexpected symbol: COMMA错误。
有效解决方案
方案1:使用Script Mediator(最推荐,兼容性最强)
直接用JavaScript操作JSON对象,完全避开XML转译的坑,不管多么特殊的JSON结构都能处理:
<script language="js"> // 从property获取JSON字符串 var rawJson = mc.getProperty("json"); // 解析成JSON对象 var jsonObj = JSON.parse(rawJson); // 构造新的payload var newPayload = { "data": jsonObj }; // 设置回消息体 mc.setPayloadJSON(newPayload); </script>
注意:如果你的WSO2版本较旧,可能需要把
language="js"换成language="nashornjs"。
方案2:调整PayloadFactory配置(必须用PayloadFactory时)
使用evaluator="text"来传递原始JSON字符串,避免XML解析:
<payloadFactory media-type="json"> <format>{"data": $1}</format> <args> <!-- 用text evaluator直接传递原始字符串,不做XML转译 --> <arg evaluator="text" expression="get-property('json')"/> </args> </payloadFactory> <!-- 确保消息类型设置正确 --> <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
这个方法对大多数场景有效,但如果JSON里包含特殊转义字符,可能需要额外处理。
方案3:使用JSON Transform Mediator(WSO2 EI 6.5+/APIM 3.x+适用)
如果你的WSO2版本支持JSON Transform Mediator,可以直接用它构造payload,全程操作JSON:
<jsontransform> <output>{ "data": $ctx:json }</output> </jsontransform>
这个方法语法更简洁,不需要写脚本。
额外注意事项
- 存储JSON到property时,务必指定
type="STRING",避免WSO2自动把它转成OM元素,埋下解析隐患。 - 你的测试序列能工作可能是因为测试场景的JSON结构更简单,WSO2的自动转译逻辑在特定情况下能兼容,但复杂场景(比如值是数组字符串)就会暴露问题。
- 尽量避免用
evaluator="xml"处理带特殊字符的JSON,因为XML和JSON的语法规则天生存在冲突(冒号作为命名空间就是典型)。
内容的提问来源于stack exchange,提问作者Peter Kronenberg
相关产品推荐
相关产品推荐

