在使用 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>
有两个 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>