【问题标题】:How to concatenate JSON array values in WSO2 ESB?如何在 WSO2 ESB 中连接 JSON 数组值?
【发布时间】:2017-08-11 16:05:27
【问题描述】:

我们有如下 json 对象,预期结果为:“(001),(011),(089),(120)”。

任何人都可以建议如何迭代 json 数组并连接提到的值。"(001),(011),(089),(120)"

提前致谢。

{
    "Element": {
        "Values": {
            "AgentID": "aaaaa",
            "TransactionData": [
                {
                    "No": "001"
                },
                {
                    "No": "011"
                },
                {
                    "No": "089"
                },
                {
                    "No": "120"
                }
            ]
        }
    }
}

【问题讨论】:

    标签: wso2 wso2esb


    【解决方案1】:

    您可以通过使用迭代介体、过滤介体和具有操作范围的属性来实现。试试这个解决方案。最后,您将在 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>
    

    有效负载工厂调解器仅用于模拟您的场景。如果您的客户端发送此 JSON 有效负载,则您不需要此有效负载工厂中介。

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 1970-01-01
      • 2014-03-20
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多