使用 foreach 中介器使用 WSO2 ESB 转换 JSON 数组

Doh*_*mis 2 wso2 wso2esb

我正在使用 WSO2 ESB V4.9.0 为需要返回转换后的 JSON 数组的指定端点创建代理服务。我已经在输出序列中设置了一个带有 foreach 中介器和 payloadfactory 的代理服务以及日志语句,以查看发生了什么。结果是每个单独的数组元素都按预期进行了转换,但是在循环结束时,单个元素不会合并回单个数组,正如文档所暗示的那样。结果是只返回最后一个元素。

我唯一能看到的是,我见过的大多数示例不仅有一个带有数组的元素,而不仅仅是一个数组。有谁知道这是否可能?

原始端点返回如下内容:

[
{"id": "1",
"type": "object",
"name": "first",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]",
"displayName": "first record"},

{"id": "2",
"type": "object",
"name": "second",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]",
"displayName": "second record"},
..etc...
]
Run Code Online (Sandbox Code Playgroud)

代理服务所需的返回是这样的:

[
{"name": "first record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"},
{"name": "second record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"},
..etc...
]
Run Code Online (Sandbox Code Playgroud)

代理的实际回报是这样的:

{"name": "first record",
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"}
Run Code Online (Sandbox Code Playgroud)

代理的配置在这里:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="newfeed_v2"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log/>
      </inSequence>
      <outSequence>
         <log level="full">
            <property name="MESSAGE" value="FIRST"/>
         </log>
         <foreach id="foreach_1" expression="//jsonArray/jsonElement">
            <sequence>
               <payloadFactory media-type="json">
                  <format>{ 
   "name" : "$1", 
   "bounds" : "$2"  
}</format>
                  <args>
                     <arg evaluator="json" expression="$.displayName"/>
                     <arg evaluator="json" expression="$.bounds"/>
                  </args>
               </payloadFactory>
                <log level="full">
                  <property name="MESSAGE" value="ENDLOOP"/>
               </log>
            </sequence>
         </foreach>
         <log level="full">
            <property name="MESSAGE" value="LAST"/>
         </log>
         <log/>
         <send/>
      </outSequence>
      <endpoint>
         <address uri="https://api.backend.com"/>
      </endpoint>
   </target>
   <description/>
</proxy>
Run Code Online (Sandbox Code Playgroud)

Jor*_*rio 5

你可以试试这个作为解决方法吗:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="newfeed_v2"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="json">
            <format>[
            {"id": "1",
            "type": "object",
            "name": "first",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "first record"},

            {"id": "2",
            "type": "object",
            "name": "second",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "second record"},

            {"id": "4",
            "type": "object",
            "name": "tercero",
            "bounds":"[[-0.256,51.531],[-0.102,51.656]]",
            "displayName": "tercer record"}
            ]

            </format>
            <args/>
         </payloadFactory>
         <log level="full"/>
         <loopback/>
      </inSequence>
      <outSequence>
         <log level="full">
            <property name="MESSAGE" value="FIRST"/>
         </log>
         <property name="Person" scope="default">
            <value xmlns=""/>
         </property>
         <foreach id="foreach_1" expression="//jsonArray/jsonElement">
            <sequence>
               <payloadFactory media-type="json">
                  <format>{
                            "name" : "$1",
                            "bounds" : "$2"
                            }
                  </format>
                  <args>
                     <arg evaluator="json" expression="$.displayName"/>
                     <arg evaluator="json" expression="$.bounds"/>
                  </args>
               </payloadFactory>
               <enrich>
                  <source clone="true" xpath="$body//jsonObject"/>
                  <target action="child" xpath="$ctx:Person"/>
               </enrich>
               <log level="full">
                  <property name="MESSAGE1" value="ENDLOOP"/>
               </log>
            </sequence>
         </foreach>
         <enrich>
            <source clone="true" xpath="$ctx:Person"/>
            <target type="body"/>
         </enrich>
         <log level="full">
            <property name="MESSAGE" value="ENDLOOP"/>
         </log>
         <!--property name="messageType" value="text/xml" scope="axis2" type="STRING"/--><log level="full">
            <property name="TRANSFORMED MESSAGE" value="LAST"/>
         </log>
         <send/>
      </outSequence>
      <faultSequence/>
   </target>
   <description/>
</proxy>
Run Code Online (Sandbox Code Playgroud)

我的回复:

{"value":[{"name":"first record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"},{"name":"second record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"},{"name":"tercer record","bounds":"[[-0.256,51.531],[-0.102,51.656]]"}]}
Run Code Online (Sandbox Code Playgroud)