Wso2 EnrichMediator:无法添加子级,因为目标不是JSON数组

Wso2 EnrichMediator:无法添加子级,因为目标不是JSON数组,wso2,wso2esb,Wso2,Wso2esb,我有一个这样的请求负载 {"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":&q

我有一个这样的请求负载

{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}
我把它捕获到一个属性中

<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="reserveration-before" scope="default" type="STRING"/>
我在“roomInfo”中捕获该信息,并尝试使用Enrich将其附加到原始的“reservationsBody”JSON中

<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
  <payloadFactory media-type="json">
     <format>$1</format>
     <args>
        <arg evaluator="xml" expression="get-property('reserveration-before')"/>
     </args>
  </payloadFactory>
  <enrich>
     <source clone="true" property="roomInfo" type="property"/>
     <target action="child" property="reservationBody" type="property"/>
  </enrich>

我很困惑,因为它看起来确实像一个JSON数组?很抱歉,如果修复是显而易见的,我对WSO2非常陌生。

首先回答您的问题,以下不是JSON数组。因此,要克服你的问题,你有两个选择

{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}
选项1

在将其存储在属性中介器中之前,可以将上述内容转换为JSON数组,如下所示。您可以使用许多选项来实现这一点,例如使用有效负载工厂中介器、丰富中介器、属性中介器等

[{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}}]
但随后生成的响应如下所示

[{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}},{"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}]
选项2

当您想要充实的目标是一个属性(请参阅[1]中的java代码)时,就会出现上述异常。当目标是属性时,它会检查目标属性是否包含JSON数组,如果不包含,则抛出错误[2]

因此,为了避免这种情况,您可以采用稍微不同的方法来丰富有效负载

捕获属性中的有效负载

<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
因此,根据输出情况,您可以选择选项1或选项2

[1]-https://github.com/wso2/wso2-synapse/blob/master/modules/core/src/main/java/org/apache/synapse/mediators/elementary/Target.java#L437

[2]-https://github.com/wso2/wso2-synapse/blob/master/modules/core/src/main/java/org/apache/synapse/mediators/elementary/Target.java#L441

[{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]}},{"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}]
<property expression="json-eval($.reservationBody)" name="reservationBody" scope="default" type="STRING"/>
<property expression="json-eval($)" name="roomInfo" scope="default" type="STRING"/>
 <enrich>
    <source clone="true" property="reservationBody" type="property"/>
    <target type="body"/>
 </enrich>
<enrich>
            <source clone="true" property="roomInfo" type="property"/>
            <target action="child" xpath="json-eval($)"/>
</enrich>
{"guest":{"name":{"firstName":"MARK","lastName":"DAVIS","middleInit":"G","title":"MR"},"addresses":[{"addressLine1":"4148 PINE HILL CV N","addressType":"home","city":"LAKELAND","country":"US","postalCode":"38002","state":"XX"},{"addressLine1":"522 South Road","addressType":"business","city":"Ploughkeepsie","company":"I B M","country":"US","postalCode":"12601","state":"NY"}],"emails":[{"emailAddress":"tom.smith@yahoo.com","emailType":"home"},{"emailAddress":"Tom@IBM.COM","emailType":"business"}],"phones":[{"phoneNumber":"0019013774041","phoneType":"home"},{"phoneNumber":"496196939781","phoneType":"business"}]},"roomStays":[{"arrivalDate":"2020-07-20","departureDate":"2020-07-21","numAdults":1}]}