需要帮助使用Mule将两个Json结果合并为单个响应吗

需要帮助使用Mule将两个Json结果合并为单个响应吗,mule,mule-studio,Mule,Mule Studio,有两个http调用(调用RESTAPI),它们给出两个不同的响应。 第一个是为下面这样的商店提供json响应 { "shops": [ { "shop": { "code": "a", "streetName": "a", "city": "a", "district": "a",

有两个http调用(调用RESTAPI),它们给出两个不同的响应。 第一个是为下面这样的商店提供json响应

    {
    "shops": [
        {
            "shop": {
                "code": "a",
                "streetName": "a",
                "city": "a",
                "district": "a",
                "state": "a",
                "postalCode": "a",
                "country": "a"

            }
        },
        {
            "shop": {
                "code": "b",
                "streetName": "b",
                "city": "b",
                "district": "b",
                "state": "b",
                "postalCode": "b",
                "country": "b"
            }
        }
    ]
}
另一个调用是为给定的代码给销售办事处(代码与商店的代码相同)。它为给定的代码返回单个销售办事处

    {
    "salesOffice": {
        "shop": {
            "code": "a"
        },
        "office": "a",
        "branch": "a",
        "district": "a",
        "subRegion": "a",
        "region": "a"
    }
}
我的要求是获取shops,它是一个json数组,为每个shop添加sales office,并返回一个json响应,如下所示

 {
    "shops": [
        {
            "shop": {
                "code": "a",
                "streetName": "a",
                "city": "a",
                "district": "a",
                "state": "a",
                "postalCode": "a",
                "country": "a",
                "salesOffice": {
                    "office": "a",
                    "branch": "a",
                    "district": "a",
                    "subRegion": "a",
                    "region": "a"
                }
            }
        },
        {
            "shop": {
                "code": "b",
                "streetName": "b",
                "city": "b",
                "district": "b",
                "state": "b",
                "postalCode": "b",
                "country": "b",
                "salesOffice": {
                    "office": "b",
                    "branch": "b",
                    "district": "b",
                    "subRegion": "",
                    "region": "b"
                }
            }
        }
    ]
}
有没有办法达到这个结果

编辑

我需要得到两个商店的销售办公室(每个商店代码都会有一个http请求),并将其合并到响应中。所以,如果我得到两个商店,那么我需要发送两个http请求,以获取salesoffice中的这些代码,然后将其与响应合并


因此,第一个电话将给我商店(让我们说两个商店)。然后我需要通过在每个商店中获取“代码”来进行两次http调用,以获得销售办事处,然后我需要将两个商店与各自的销售办事处合并。

您可以执行类似的操作。我使用dataweave转换json

模拟API响应是对API的http调用

XML文件:

    <flow name="merge-jsonFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/merge" doc:name="HTTP"/>
        <scatter-gather doc:name="Scatter-Gather">
            <expression-component doc:name="Mock API1 Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component>
            <expression-component doc:name="Mock API2 Response"><![CDATA[payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}']]></expression-component>
        </scatter-gather>
        <json:json-to-object-transformer doc:name="JSON to Object"/>
        <dw:transform-message metadata:id="0066a92a-85d8-4514-8459-b70252cb2f7b" doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
using (
    shops = payload[0].shops,
    salesOffice = payload[1].salesOffice
)
{
    shops : shops.shop  map {
        shop: {
                code: $.code,
                streetName: $.streetName,
                city: $.city,
                district: $.district,
                state: $.state,
                postalCode: $.postalCode,
                country: $.country,
                (salesOffice: {
                    office: salesOffice.office,
                    branch: salesOffice.branch,
                    district: salesOffice.district,
                    subRegion: salesOffice.subRegion,
                    region: salesOffice.region
                }) when $.code == salesOffice.shop.code 
        }
    }
}]]></dw:set-payload>
        </dw:transform-message>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </flow>

希望这有帮助

您可以这样做。我使用dataweave转换json

模拟API响应是对API的http调用

XML文件:

    <flow name="merge-jsonFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/merge" doc:name="HTTP"/>
        <scatter-gather doc:name="Scatter-Gather">
            <expression-component doc:name="Mock API1 Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component>
            <expression-component doc:name="Mock API2 Response"><![CDATA[payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}']]></expression-component>
        </scatter-gather>
        <json:json-to-object-transformer doc:name="JSON to Object"/>
        <dw:transform-message metadata:id="0066a92a-85d8-4514-8459-b70252cb2f7b" doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
using (
    shops = payload[0].shops,
    salesOffice = payload[1].salesOffice
)
{
    shops : shops.shop  map {
        shop: {
                code: $.code,
                streetName: $.streetName,
                city: $.city,
                district: $.district,
                state: $.state,
                postalCode: $.postalCode,
                country: $.country,
                (salesOffice: {
                    office: salesOffice.office,
                    branch: salesOffice.branch,
                    district: salesOffice.district,
                    subRegion: salesOffice.subRegion,
                    region: salesOffice.region
                }) when $.code == salesOffice.shop.code 
        }
    }
}]]></dw:set-payload>
        </dw:transform-message>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </flow>

希望这有帮助

您可以这样做

XML文件:

<flow name="merge-jsonFlow1">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/json-merge" doc:name="HTTP"/>
        <expression-component doc:name="Mock HTTP Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component>
        <set-variable variableName="shops" value="#[payload]" doc:name="Store Orig Payload to Variable"/>
        <processor-chain doc:name="Processor Chain">
            <splitter expression="#[json:/shops]" doc:name="Splitter"/>
            <set-variable variableName="storeCode" value="#[json:/shop/code]" doc:name="Set Store Code"/>
            <expression-component doc:name="Mock HTTP Call to Get SalesOffice"><![CDATA[if (flowVars['storeCode'] == 'a') {
    payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}';
} else if (flowVars['storeCode'] == 'b') {
    payload = '{"salesOffice":{"shop":{"code":"b"},"office":"b","branch":"b","district":"b","subRegion":"b","region":"b"}}';
}]]></expression-component>
            <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
        </processor-chain>
        <set-payload value="#[[flowVars['shops'], payload]]" doc:name="Merge Two JSON"/>
        <json:json-to-object-transformer doc:name="JSON to Object"/>
        <dw:transform-message metadata:id="c72e3e02-8350-42ec-a3cb-ca61c7b722b4" doc:name="Transform Message">
            <dw:input-payload doc:sample="json-merge.json"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
using (
    shops = payload[0].shops,
    so = payload[1].*salesOffice
)
{
    shops : shops.shop map {
        shop: using (mycode = $.code) {
                code: $.code,
                streetName: $.streetName,
                city: $.city,
                district: $.district,
                state: $.state,
                postalCode: $.postalCode,
                country: $.country,
                salesOffice: ((so map {
                    shopCode: $.shop.code,
                    office: $.office,
                    branch: $.branch,
                    district: $.district,
                    subRegion: $.subRegion,
                    region: $.region
                }) filter $.shopCode == mycode)[0]
        }
    }
}]]></dw:set-payload>
        </dw:transform-message>
    </flow>


您可以这样做

XML文件:

<flow name="merge-jsonFlow1">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/json-merge" doc:name="HTTP"/>
        <expression-component doc:name="Mock HTTP Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component>
        <set-variable variableName="shops" value="#[payload]" doc:name="Store Orig Payload to Variable"/>
        <processor-chain doc:name="Processor Chain">
            <splitter expression="#[json:/shops]" doc:name="Splitter"/>
            <set-variable variableName="storeCode" value="#[json:/shop/code]" doc:name="Set Store Code"/>
            <expression-component doc:name="Mock HTTP Call to Get SalesOffice"><![CDATA[if (flowVars['storeCode'] == 'a') {
    payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}';
} else if (flowVars['storeCode'] == 'b') {
    payload = '{"salesOffice":{"shop":{"code":"b"},"office":"b","branch":"b","district":"b","subRegion":"b","region":"b"}}';
}]]></expression-component>
            <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
        </processor-chain>
        <set-payload value="#[[flowVars['shops'], payload]]" doc:name="Merge Two JSON"/>
        <json:json-to-object-transformer doc:name="JSON to Object"/>
        <dw:transform-message metadata:id="c72e3e02-8350-42ec-a3cb-ca61c7b722b4" doc:name="Transform Message">
            <dw:input-payload doc:sample="json-merge.json"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
using (
    shops = payload[0].shops,
    so = payload[1].*salesOffice
)
{
    shops : shops.shop map {
        shop: using (mycode = $.code) {
                code: $.code,
                streetName: $.streetName,
                city: $.city,
                district: $.district,
                state: $.state,
                postalCode: $.postalCode,
                country: $.country,
                salesOffice: ((so map {
                    shopCode: $.shop.code,
                    office: $.office,
                    branch: $.branch,
                    district: $.district,
                    subRegion: $.subRegion,
                    region: $.region
                }) filter $.shopCode == mycode)[0]
        }
    }
}]]></dw:set-payload>
        </dw:transform-message>
    </flow>


你从哪里获得salesOffice“b”的记录?@ArdenWallente我通过一个http呼叫并传递“代码”来获得一个salesOffice…因此,要获得salesOffice“b”,我需要再打一次电话。你从哪里获得salesOffice“b”的记录?@ArdenVallente我通过一个http呼叫并传递“代码”来获得一个salesOffice…因此,要获得salesOffice“b”,我需要发出另一个call。我需要获得两个店铺的salesOffice(每个店铺代码都会有一个http请求),并将其合并到响应中。因此,如果我得到两个商店,那么我需要发送两个http请求,以获取salesoffice中的代码,然后将其与响应合并。因此,第一个调用将为我提供商店(假设两个商店)。然后我需要打两个http电话,让每家商店都有“代码”来联系销售办公室。。然后,我需要将两个商店与各自的销售办事处合并……我需要获得两个商店的销售办事处(每个商店代码都会有一个http请求),并将其合并到响应中。因此,如果我得到两个商店,那么我需要发送两个http请求,以获取salesoffice中的代码,然后将其与响应合并。因此,第一个调用将为我提供商店(假设两个商店)。然后我需要打两个http电话,让每家商店都有“代码”来联系销售办公室。。然后我需要将两家商店合并到各自的销售办事处……谢谢。。我得到了带有所有必填字段的最终Json。上个变压器卡住了。。非常感谢你的帮助。。我得到了带有所有必填字段的最终Json。上个变压器卡住了。。非常感谢你的帮助