2017-03-08 17 views
0

私は動的に生成されたjson-evalを使用してperticularホテルオブジェクトを選択するためにJSONPayloadを処理しようとしています。 下記のダイレクトjson-evalはうまく動作します。WSO2での動的json-eval式ESB 5

直接JSON-evalの表現:

json-eval($.content[?(@.hotelcode=='ALE1_LON')]) 

私はまだオプションが、ありません任意の運のようなbeow試してみました。

TRY 1:

<property name="htlCode" scope="default" type="STRING" value="'ALE1_LON'"/> 
<property expression="fn:concat('$.content[?(@.hotelcode==',get-property('htlCode'),')]')" name="xpathExpr" scope="default" type="STRING"/> 
<property expression="json-eval({$ctx:xpathExpr})" name="hotelContet" scope="default" type="STRING"/> 

これは、代わりに "$.content[?(@.hotelcode=='ALE1_LON')]" のJSONのパスとして "{$ctx:xpathExpr}" を使用しています。

TRY 2:それをeveluatingなしhotelContetプロパティに

<property name="htlCode" scope="default" type="STRING" value="'ALE1_LON'"/> 
<property expression="fn:concat('json-eval($.content[?(@.hotelcode==',get-property('htlCode'),')])')" name="hotelContet" scope="default" type="STRING"/> 

この店舗 "json-eval($.content[?(@.hotelcode=='ALE1_LON')])"。

TRY 3:

<property name="htlCode" scope="default" type="STRING" value="'ALE1_LON'"/> 
<property expression="json-eval($.content[?(@.hotelcode=={get-property('htlCode')})])" name="hotelContet" scope="default" type="STRING"/> 

これは、代わりに "$.content[?(@.hotelcode=='ALE1_LON')]" のJSONのパスとして "$.content[?(@.hotelcode=={get-property('htlCode')})]" を使用しています。

TRY 4:

<property name="htlCode" scope="default" type="STRING" value="'ALE1_LON'"/> 
<property expression="json-eval($.content[?(@.hotelcode=={$ctx.htlCode})])" name="hotelContet" scope="default" type="STRING"/> 

これは、代わりに "$.content[?(@.hotelcode=='ALE1_LON')]" のJSONのパスとして "$.content[?(@.hotelcode=={$ctx.htlCode})]" を使用しています。

JSONペイロード:

{ 
    "_id":"INV27_1112", 
    "_rev":"5-876038bf65752ce4505e50baea6d5581", 
    "content":[ 
     { 
      "hotelcode":"AMB3_LON", 
      "hotelname":"Ambassadors Bloomsbury" 
     }, 
     { 
      "hotelcode":"ALE1_LON", 
      "hotelname":"Alexandra" 
     }, 
     { 
      "hotelcode":"ALO_LON", 
      "hotelname":"Aloft London Excel" 
     } 
    ] 
} 

注:私は、これはスクリプト/クラスメディエーターで行うことができることを知っています。しかし、私はjson-eval内の解決策を探しています。 XPathではなくJSONPathに制限することができます。

現在、私はJSON上で以下のようなアプローチを使用して自分自身を管理しています。

<property name="htlCode" scope="default" type="STRING" value="'ALE1_LON'"/> 
<property expression="fn:concat('//content[hotelcode=',$ctx:htlCode,']')" name="hotelContentExpr" scope="default" type="STRING"/> 
<property expression="evaluate($ctx:hotelContentExpr)" name="hotelContent" scope="default" type="STRING"/> 
  • WSO2 ESBバージョン:5.0.0

答えて

0

問題

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="JsonDynamicExpression" 
     startOnLoad="true" 
     statistics="disable" 
     trace="disable" 
     transports="http,https"> 
    <target> 
     <inSequence> 
     <payloadFactory media-type="json"> 
      <format>{ 
    "_id":"INV27_1112", 
    "_rev":"5-876038bf65752ce4505e50baea6d5581", 
    "content":[ 
     { 
      "hotelcode":"AMB3_LON", 
      "hotelname":"Ambassadors Bloomsbury" 
     }, 
     { 
      "hotelcode":"ALE1_LON", 
      "hotelname":"Alexandra" 
     }, 
     { 
      "hotelcode":"ALO_LON", 
      "hotelname":"Aloft London Excel" 
     } 
    ] 
}</format> 
      <args/> 
     </payloadFactory> 
     <property name="htlCode" scope="default" type="STRING" value="ALO_LON"/> 
     <property expression="fn:concat('//content[hotelcode=','&#34;',get-property('htlCode'),'&#34;',']')" 
        name="hotelContentExpr" 
        scope="default" 
        type="STRING"/> 
     <enrich> 
      <source clone="true" xpath="evaluate(get-property('hotelContentExpr'))"/> 
      <target type="body"/> 
     </enrich> 
     <log> 
      <property expression="$body" name="Cuerpo////////////////////////////"/> 
     </log> 
     <loopback/> 
     </inSequence> 
     <outSequence> 
     <send/> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 
+0

を解決するために、このソリューションをテストしてください答えをいただき、ありがとうございます。はい、私は私の質問の後半で述べたように、JSON上のXPathでそれを行うことができます。しかし、私はjson-eval関数でJSONPathを使ってそれを行う方法を楽しみにしています。 – namalfernandolk