"Merge two payload into one in transform component "
"Merge two payload into one in transform component "
我正在尝试将两个 json 有效载荷添加到一个中,但出现错误。我正在使用 scatter gather 获取多个有效载荷并将有效载荷组合到转换消息中。 错误是:执行时出现异常:
payload[0] map (bookListing) -> 使用 (id = bookListing.bookId) {
'map' 运算符的类型不匹配
找到:字符串,:函数
必需:数组,:函数。
代码:
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="file-connector-config" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />
<flow name="muleRequester">
<http:listener config-ref="HTTP_Listener_Configuration" path="/requester" doc:name="HTTP"/>
<scatter-gather doc:name="Scatter-Gather">
<processor-chain>
<mulerequester:request resource="file://src/main/resources/input1" returnClass="java.lang.String" doc:name="Retrieve File1"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</processor-chain>
<processor-chain>
<mulerequester:request resource="file://src/main/resources/input2" returnClass="java.lang.String" doc:name="Retrieve File2"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</processor-chain>
</scatter-gather>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
payload[0] map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title: bookListing.title,
price: bookListing.price,
(payload[1] filter ($.*bookId contains id) map (bookAuthor) -> {
author:bookAuthor.author
})
}]]></dw:set-payload>
</dw:transform-message>
<file:outbound-endpoint responseTimeout="10000" doc:name="File" outputPattern="#[function:systime].json" path="src/main/resources/output"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>
有效负载 1 -
[
{
"bookId":"101",
"title":"world history",
"price":“19.99”
},
{
"bookId":"202",
"title":"the great outdoors",
"price":“15.99”
}
]
有效负载 2-
[
{
"bookId":"101",
"author":"john doe"
},
{
"bookId":"202",
"author":"jane doe"
}
]
预期输出-
[
{
"bookId": "101",
"title": "world history",
"year": "2017",
"isbn": "11111",
"price": "19.99",
"author": "john doe"
},
{
"bookId": "202",
"title": "the great outdoors",
"year": "2016",
"isbn": "22222",
"price": "15.99",
"author": "jane doe"
}
]
从文件返回的值只是字符串,因此需要先将它们读入 dataweave 可以使用的内容。像这样使用读取函数:
read(payload[0], 'application/json')
和
read(payload[1], 'application/json')
这是一个完整的例子。 (我在 scatter-gather 中删除了示例 json):
<scatter-gather doc:name="Scatter-Gather">
<set-payload value="[ { "bookId":"101", "title":"world history", "price":"19.99" }, { "bookId":"202", "title":"the great outdoors", "price":"15.99" } ]" doc:name="payload1"/>
<set-payload value="[ { "bookId":"101", "author":"john doe" }, { "bookId":"202", "author":"jane doe" } ]" doc:name="payload2"/>
</scatter-gather>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
read(payload[0], 'application/json') map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title: bookListing.title,
price: bookListing.price,
(read(payload[1], 'application/json') filter ($.*bookId contains id) map (bookAuthor) -> {
author:bookAuthor.author
})
}]]></dw:set-payload>
</dw:transform-message>
或者您可以事先将整个内容读入 Json
我正在尝试将两个 json 有效载荷添加到一个中,但出现错误。我正在使用 scatter gather 获取多个有效载荷并将有效载荷组合到转换消息中。 错误是:执行时出现异常: payload[0] map (bookListing) -> 使用 (id = bookListing.bookId) { 'map' 运算符的类型不匹配 找到:字符串,:函数 必需:数组,:函数。
代码:
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="file-connector-config" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />
<flow name="muleRequester">
<http:listener config-ref="HTTP_Listener_Configuration" path="/requester" doc:name="HTTP"/>
<scatter-gather doc:name="Scatter-Gather">
<processor-chain>
<mulerequester:request resource="file://src/main/resources/input1" returnClass="java.lang.String" doc:name="Retrieve File1"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</processor-chain>
<processor-chain>
<mulerequester:request resource="file://src/main/resources/input2" returnClass="java.lang.String" doc:name="Retrieve File2"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</processor-chain>
</scatter-gather>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
payload[0] map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title: bookListing.title,
price: bookListing.price,
(payload[1] filter ($.*bookId contains id) map (bookAuthor) -> {
author:bookAuthor.author
})
}]]></dw:set-payload>
</dw:transform-message>
<file:outbound-endpoint responseTimeout="10000" doc:name="File" outputPattern="#[function:systime].json" path="src/main/resources/output"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>
有效负载 1 - [ { "bookId":"101", "title":"world history", "price":“19.99” }, { "bookId":"202", "title":"the great outdoors", "price":“15.99” } ]
有效负载 2- [ { "bookId":"101", "author":"john doe" }, { "bookId":"202", "author":"jane doe" } ]
预期输出-
[ { "bookId": "101", "title": "world history", "year": "2017", "isbn": "11111", "price": "19.99", "author": "john doe" }, { "bookId": "202", "title": "the great outdoors", "year": "2016", "isbn": "22222", "price": "15.99", "author": "jane doe" } ]
从文件返回的值只是字符串,因此需要先将它们读入 dataweave 可以使用的内容。像这样使用读取函数:
read(payload[0], 'application/json')
和
read(payload[1], 'application/json')
这是一个完整的例子。 (我在 scatter-gather 中删除了示例 json):
<scatter-gather doc:name="Scatter-Gather">
<set-payload value="[ { "bookId":"101", "title":"world history", "price":"19.99" }, { "bookId":"202", "title":"the great outdoors", "price":"15.99" } ]" doc:name="payload1"/>
<set-payload value="[ { "bookId":"101", "author":"john doe" }, { "bookId":"202", "author":"jane doe" } ]" doc:name="payload2"/>
</scatter-gather>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
read(payload[0], 'application/json') map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title: bookListing.title,
price: bookListing.price,
(read(payload[1], 'application/json') filter ($.*bookId contains id) map (bookAuthor) -> {
author:bookAuthor.author
})
}]]></dw:set-payload>
</dw:transform-message>
或者您可以事先将整个内容读入 Json