如何解决WS02 无法解析带有冒号的 json 键
使用 WSO2,我在解析 Json 时遇到问题,其中一个键带有冒号。该值也有逗号
例如
{
"foo:bar" : "a,b,c"
}
我在一个属性中有这个 json。我正在使用这样的 payloadFactory:
<payloadFactory media-type="json">
<format>
{
"data" : $1
}
</format>
<args>
<arg evaluator="xml" expression="get-property('json')"/>
</args>
</payloadFactory>
出现错误:
[2021-03-19 08:54:31,213] ERROR {org.apache.synapse.commons.json.JsonUtil} - #writeAsJson. Could not convert OMElement to JSON. Invalid XML payload. Error>>> Undeclared namespace prefix "foo"
at [row,col {unknown-source}]: [1,447]
[2021-03-19 08:54:31,216] ERROR {org.wso2.carbon.integrator.core.json.JsonStreamFormatter} - Error occurred while writing to application/json java.lang.reflect.InvocationTargetException
如果我尝试将值放在引号中(这不是我真正想要的结果)
<payloadFactory media-type="json">
<format>
{
"data" : "$1"
}
</format>
<args>
<arg evaluator="xml" expression="get-property('json')"/>
</args>
</payloadFactory>
这次我得到了错误
[2021-03-19 09:06:09,045] ERROR {org.apache.axiom.om.impl.llom.OMSourcedElementImpl} - Could not get parser from data source for element jsonObject javax.xml.stream.XMLStreamException: java.io.IOException: Illegal character: <f>
at org.apache.synapse.commons.staxon.core.base.AbstractXMLStreamReader.initialize(AbstractXMLStreamReader.java:245)
尝试指定 evaluator="json"
。使用 "data" : $1
(不带双引号)时,我收到这个奇怪的错误:
[2021-03-19 09:40:52,525] ERROR {org.apache.synapse.mediators.base.SequenceMediator} - javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,23]
Message: Unexpected symbol: COMMA org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,23]
Message: Unexpected symbol: COMMA
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
我认为这是在抱怨 Json 值中的逗号
有没有办法做到这一点?
更新:我无法使用此测试序列重现此内容
<?xml version="1.0" encoding="UTF-8"?>
<api context="/testMeta" name="TestMeta" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="PUT">
<inSequence>
<property expression="json-eval($)" name="test" scope="default" type="STRING"/>
<payloadFactory media-type="json">
<format>
{
"data" : $1
}
</format>
<args>
<arg evaluator="xml" expression="get-property('test')"/>
</args>
</payloadFactory>
<property description="JSONIFY" name="messageType" scope="axis2" type="STRING" value="application/json"/>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>
然而,在我的实际代码中,我伪造了 JSON 并尝试了各种值。
{
"foo:bar" : "a,c"
}
有效,但实际值之一,
{
"pdf:unmappedUnicodeCharsPerPage":"[0,0]"
}
没有。我不知道究竟是什么触发了它。也试过
{
"foo:unmappedUnicodeCharsPerPage":"[0,0]"
}
确保字符串 pdf
没有什么特别之处
我伪造它的方式只是对值进行硬编码:
<payloadFactory description="BuildFinalPayload" media-type="json">
<format>
{
"metadata" : {"foo:unmappedUnicodeCharsPerPage":"[0,0]"
}
</format>
<args/>
</payloadFactory>
所以它似乎与如何将值加载到属性中没有任何关系
更新 #2
所以我意识到错误发生在序列的末尾,当它即将退出时。我的整个序列看起来像这样
<iterate>
<payloadFactory/>
<aggregate/>
</iterate>
failure occurs here
<respond/>
我可以在 payloadFactory 之后登录 json-eval($)
并且看起来不错
我收到了声明
<property name="messageType" scope="axis2" type="STRING" value="application/json" />
最后,但即使我将其注释掉,我也会收到错误
解决方法
我尝试复制您的问题,但使用以下代码但没有发现任何错误,我认为在您将数据放入属性或属性设置为“OM”之前,您的 messageType[1] 有问题将把它变成一个 XML 对象。但由于这未包含在您的示例中,我无法确定。
<property expression="json-eval($)" name="test"/>
<payloadFactory media-type="json">
<format>
{
"data" : $1
}
</format>
<args>
<arg evaluator="xml" expression="get-property('test')"/>
</args>
</payloadFactory>
作为我使用的输入:
{
"foo:bar" : "a,b,c"
}
[1]https://docs.wso2.com/display/EI611/Generic+Properties#GenericProperties-messageType [2]https://docs.wso2.com/display/EI610/Property+Mediator(关于 TYPE = OM 的部分)