2017-03-08 20 views
0

我試圖使用動態生成的json-eval來選擇一個特定的酒店對象來處理JSONPayload。 下面提到的直接json-eval工作正常。WSO2 ESB中的動態json-eval表達式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"/> 

這裏使用了 「{$ctx:xpathExpr}」 作爲JSON路徑,而不是 「$.content[?(@.hotelcode=='ALE1_LON')]」。

TRY 2:

<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')])」 到hotelContet屬性,而不eveluating它。

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=={get-property('htlCode')})]」 作爲JSON路徑,而不是 「$.content[?(@.hotelcode=='ALE1_LON')]」。

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=={$ctx.htlCode})]」 作爲JSON路徑,而不是 「$.content[?(@.hotelcode=='ALE1_LON')]」。

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中的解決方案。如果我能限制到JSONPath而不是XPath,那更好。

目前我正在管理自己使用下面類似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