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

Need Help in Merging two Json Results into single response Using Mule

有两个 http 调用(调用 rest api)给出了两个不同的响应。 第一个是 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"
            }
        }
    ]
}

另一个电话是给定代码的销售办公室(代码与商店相同)。return给定代码的单个销售办公室

    {
    "salesOffice": {
        "shop": {
            "code": "a"
        },
        "office": "a",
        "branch": "a",
        "district": "a",
        "subRegion": "a",
        "region": "a"
    }
}

我的要求是获取商店,这是一个 json 数组,并为每个商店添加销售办公室和 return 单个 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 请求以获取这些代码的销售办公室,然后将其与响应合并。

所以第一个电话会告诉我商店(比如说两家商店)。然后我需要通过在每个商店中出现 "code" 来进行两次 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>

响应示例:

{
  "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"
      }
    }
  ]
}

希望对您有所帮助

你可以这样做。

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>