WSO 2 ESB 5中的动态json-eval表达式

slsn1g29  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在尝试使用动态生成的json-eval来处理JSONPayload以选择特定的酒店对象。

直接json-eval表达式:

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

我已经尝试了以下类似的选择,但没有任何运气。

尝试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}“而不是“$.content[?(@.hotelcode=='ALE1_LON')]“作为JSON路径。

尝试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属性,而不评估它。

尝试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')})]“而不是“$.content[?(@.hotelcode=='ALE1_LON')]“作为JSON路径。

尝试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})]“而不是“$.content[?(@.hotelcode=='ALE1_LON')]“作为JSON路径。

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上的below like方法来管理自己。

<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"/>
  • WSO 2 ESB版本:5.0.0
htrmnn0y

htrmnn0y1#

请测试此解决方案以解决您的问题

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

ttvkxqim2#

我正在使用版本6.6.0 EI,此解决方案对我有效:

<property name="num" value="0"/>
<!-- To avoid json path compilation faliure at run time concat function is been used -->
<property expression="fn:concat('json-eval($..[', $ctx:num, ':])')" name="jsonPath" scope="default" type="STRING"/>
<log level="custom">
    <property name="content" expression="json-eval({$ctx:jsonPath})"/>
</log>

我希望能帮助你和其他人与不同的EI版本

相关问题