我正在尝试将两个json有效负载添加到一个中,但出现错误。我正在使用散点收集,在此我将获得多个有效负载并将有效负载组合到转换消息中。 错误是:执行时发生异常: 有效载荷[0]映射(bookListing)->使用(id = bookListing.bookId){ “地图”运算符的类型不匹配 找到:string,:function 必需的:array,:function。
代码:
<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”:“世界历史”, “价格”:“ 19.99” }, { “ bookId”:“ 202”, “ title”:“户外活动很棒”, “价格”:“ 15.99” } ]
有效载荷2- [ { “ bookId”:“ 101”, “ author”:“ john doe” }, { “ bookId”:“ 202”, “作者”:“珍妮·多伊” } ]
预期输出-
[ { “ bookId”:“ 101”, “ title”:“世界历史”, “年份”:“ 2017”, “ isbn”:“ 11111”, “ price”:“ 19.99”, “ author”:“ john doe” }, { “ bookId”:“ 202”, “ title”:“户外活动很棒”, “年份”:“ 2016”, “ isbn”:“ 22222”, “ price”:“ 15.99”, “ author”:“ jane doe” } ]
答案 0 :(得分:1)
文件返回的值只是字符串,因此需要先将它们读入dataweave可以使用的值中。像这样使用读取功能:
read(payload[0], 'application/json')
和
read(payload[1], 'application/json')
这里是一个完整的例子。 (我已经在分散收集中存入了示例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