需要帮助使用Mule将两个Json结果合并为单个响应吗
有两个http调用(调用RESTAPI),它们给出两个不同的响应。 第一个是为下面这样的商店提供json响应需要帮助使用Mule将两个Json结果合并为单个响应吗,mule,mule-studio,Mule,Mule Studio,有两个http调用(调用RESTAPI),它们给出两个不同的响应。 第一个是为下面这样的商店提供json响应 { "shops": [ { "shop": { "code": "a", "streetName": "a", "city": "a", "district": "a",
{
"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。上个变压器卡住了。。非常感谢你的帮助