2017-01-10 16 views
1

WSO2 ESB V4.9.0を使用して、指定されたエンドポイントのプロキシサービスを作成しました。このプロキシサービスは、変換されたJSON配列を返す必要があります。 foreachメディエータとpayloadfactoryをoutシーケンスでプロキシサービスに設定し、何が起きているのかを知るためにログステートメントを設定しました。 結果として、個々の配列要素はそれぞれ期待通りに変換されますが、ドキュメントの意味でループ の最後に個々の要素が単一の配列にマージされることはありません。その結果、最終要素のみが返されます。foreachメディエータを使用してWSO2 ESBでJSON配列を変換

私が見ることができるのは、私が見てきた例のほとんどが、単なる配列ではなく、配列rathetを持つ要素だけではないということです。これが可能なら誰でも知っていますか?

オリジナルエンドポイントは、このような何かを返します。

[ 
{"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... 
] 
プロキシサービスから

必要なリターンはこのようなものです:

[ 
{"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... 
] 
このようなプロキシから

実際のリターン:の

{"name": "first record", 
"bounds":"[[-0.256,51.531],[-0.102,51.656]]"} 

設定プロキシはここにあります:

<?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> 

答えて

3

あなたは回避策として、これを試すことができます:

<?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> 

私の応答:私はこのようにやったように、各仲介者のための

{"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]]"}]} 
+0

これは私にもう少し感謝してくれました。 – Dohnomis

0

は、ルート要素に分割さ表現が追加されます、

<api context="/foreach" name="foreach" xmlns="http://ws.apache.org/ns/synapse"> 
    <resource methods="GET"> 
     <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"> 
      </log> 
      <foreach expression="//jsonArray/jsonElement"> 
       <sequence> 
        <payloadFactory media-type="xml"> 
         <format> 
          <result xmlns=""> 
           <name>$1</name> 
           <bounds>$2</bounds> 
          </result> 
         </format> 
         <args> 
          <arg evaluator="json" expression="$.displayName"/> 
          <arg evaluator="json" expression="$.bounds"/> 
         </args> 
        </payloadFactory> 
       </sequence> 
      </foreach> 
      <property name="messageType" scope="axis2" type="STRING" value="application/json"/> 
      <log level="full"/> 

      <respond/> 
     </inSequence> 
     <outSequence> 
      <send/> 
     </outSequence> 
     <faultSequence/> 
    </resource> 
</api> 

と私はこのような応答を得ました

{ "result": [{"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]]}]} 
関連する問題