如何在WSO2 ESB中连接JSON数组值?

时间:2015-07-29 08:16:44

标签: wso2 wso2esb

我们有如下所示的json对象,预期结果:"(001),(011),(089),(120)"。

任何人都可以建议如何迭代json数组并将值连接起来。namespace DerivedClass { //use the fully qualified name for BaseClass: public partial class DerivedClass : BaseClass.BaseClass { public void MyValueClass() { this.ValueClass(); } } }

提前致谢。

"(001),(011),(089),(120)"

2 个答案:

答案 0 :(得分:4)

您可以使用迭代介体,过滤介体和具有操作范围的属性来完成此操作。试试这个解决方案最后,您将在concat-data属性中具有(001),(011),(089),(120)值。我添加了完整的代理供您参考。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="StockQuoteProxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="json">
            <format>
{
    "Element": {
        "Values": {
            "AgentID": "aaaaa",
            "TransactionData": [
                {
                    "No": "001"
                },
                {
                    "No": "011"
                },
                {
                    "No": "089"
                },
                {
                    "No": "120"
                }
            ]
        }
    }
}
</format>
            <args/>
         </payloadFactory>
         <iterate continueParent="true"
                  expression="//Element/Values/TransactionData"
                  sequential="true">
            <target>
               <sequence>
                  <property name="data"
                            expression="json-eval($.TransactionData.No)"
                            type="STRING"/>
                  <filter source="boolean(get-property('operation','concat-data'))" regex="false">
                     <then>
                        <property name="concat-data"
                                  expression="fn:concat('(',get-property('data'),')')"
                                  scope="operation"
                                  type="STRING"/>
                     </then>
                     <else>
                        <property name="concat-data"
                                  expression="fn:concat(get-property('operation','concat-data'),',','(',get-property('data'),')')"
                                  scope="operation"
                                  type="STRING"/>
                     </else>
                  </filter>
               </sequence>
            </target>
         </iterate>
         <log level="custom">
            <property name="con-cat-data"
                      expression="get-property('operation','concat-data')"/>
         </log>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
   </target>
   <publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
   <description/>
</proxy>

Payload工厂介体仅用于模拟您的方案。如果您的客户端发送此JSON有效负载,则您不需要具有此有效负载工厂介体。

过滤器介体用于省略前导逗号字符。如果您不使用过滤器,则会得到,(001),(011),(089),(120)(请注意前导逗号字符)。当然,还有其他方法可以删除前导逗号字符。

有关具有操作范围的属性的更多详细信息,请参阅this

答案 1 :(得分:0)

对于这种逻辑,我有时喜欢脚本调解器,因为IMO更容易实现字符串拼接/连接,条件xml / json元素构建等等。