WS02 无法解析带有冒号的 json 键

如何解决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 的部分)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?