DataWeave 中的某些函数和操作似乎以惰性方式执行,不会一次加载所有记录或仅在调用时执行。同时,有些似乎支持流媒体。两者有什么区别?
我正在努力改造我的有效载荷.我有这种情况.
输入有效负载如下所示: -
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": {
"city": null,
"state": null
}
}}
Run Code Online (Sandbox Code Playgroud)
我使用%output application/json skipNullOn = "everywhere"
它返回我下面的JSON
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}
Run Code Online (Sandbox Code Playgroud)
但是如果位置对象中的所有字段都是空的,我不希望有空的位置对象.我期待这样的事情
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}
Run Code Online (Sandbox Code Playgroud) 我目前的情况:
我有10000条记录作为批量输入.根据我的理解,批处理仅用于逐个记录处理.因此,我在批处理步骤中使用dataweave组件转换每个记录(注意:我没有使用任何批处理提交)并将每个记录写入文件.进行逐条记录处理的原因在于,在任何特定记录中都存在无效数据,只有该特定记录失败,其余部分将被正确处理.
但在我看到的许多博客中,他们使用带有dataweave组件的batchcommit(带流).因此,根据我的理解,所有记录将一次性提供给数据编织,如果一条记录包含无效数据,则所有10000条记录都将失败(在数据编织时).然后,逐个记录处理的点丢失.以上假设是正确的还是我想错了?
这就是我不使用批量提交的原因.
现在,正如我所说,我将每条记录发送到一个文件.实际上,我确实需要将每条记录发送到5个不同的CSV文件.所以,目前我在BatchStep中使用Scatter-Gather组件将它发送到五个不同的路由.
因为,你可以看到图像.输入阶段提供10000条记录的集合.每条记录将使用Scatter-Gather发送到5条路线.
是,我使用的方法是好的,或任何更好的设计可以遵循?
此外,我已经创建了第二个批处理步骤,仅捕获FAILEDRECORDS.但是,使用当前的设计,我无法捕获失败的记录.
DataWeave不喜欢我正在尝试用它做什么,而且我不确定我做错了什么,或者它是否是DataWeave的限制是不可能的.
这是一个场景:我正在查询Salesforce并获得两个值:让我们称之为X和Y.
这是我想要的返回,[{X:Y}, {X2:Y2}, {X3:Y3}, ...]
但是使用DataWeave似乎不可能获得像这样的键值对,相反,它似乎只能为脚本中的每个值专门设置Key,如下所示:[{Value_X: X, Value_Y: Y}, {Value_X: X2, Value_Y: Y2}, ...]
这是我当前的DataWeave脚本,但它给了我第二个结果:
%dw 1.0
%output application/java
---
payload map {
Value_X: $.X,
Value_Y: $.Y
}
Run Code Online (Sandbox Code Playgroud)
这是我希望工作的DataWeave脚本,但不是
%dw 1.0
%output application/java
---
payload map {
$.X: $.Y
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个员工详细信息的XML文件,例如id,name和address,现在我想将它转换为JSON文件,在谈话之前我想用地址字段中的空格替换指定的特殊字符( - ,/). json文件
下面是我的Dataweave转换代码
%dw 1.0
%output application/json
---
payload map ((payload01 , indexOfPayload01) -> {
Id: payload01 .d as :string,
Name: payload01.Name as :string,
Address: payload01.Address replace /(?)/ with " "
})
Run Code Online (Sandbox Code Playgroud)
那么我应该在replace /()/函数中写什么来替换特殊字符, -和/和空格?
我有这样的JSON:
{
"dcsId": "1184001100000000517",
"marketCode": "US",
"languageCode": "en-US",
"profile": {
"base": {
"username": "arunima27",
"activeInd": "R",
"phone": [
{
"activeInd": "Y",
"type": "mobile",
"primaryInd": "Y",
"number": "2234566788"
},
{
"activeInd": "N",
"type": "mobile",
"primaryInd": "N",
"number": ""
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
从这个输入JSON我们需要提取payload.profile.base.phone.number,其中payload.profile.base.phone.type =="mobile"和payload.profile.base.phone.activeInd =="Y".实际上,我们需要循环遍历JSON数组(payload.profile.base.*phone)并仅获取活动且类别/类型为mobile的电话号码.
我们需要如下输出:
{
"dcsId": "1184001100000000517",
"marketCode": "US",
"languageCode": "en-US",
"username" : "arunima27",
"phoneNumber" : "2234566788"
}
Run Code Online (Sandbox Code Playgroud)
我们在为"phoneNumber"输出变量进行此转换时遇到问题.
我正在学习Mule Dev 1课程,并且陷入模块内容和我在实践中看到的东西之间。
模块内容指出:
“使用一系列功能时,链中的最后一个功能将首先执行。”
所以
filghts orderBy $.price filter ($.availableSeats > 30)
Run Code Online (Sandbox Code Playgroud)
会“先过滤然后再排序”。
但是,我看到以下语句:
payload.flights orderBy $.price filter $.price < 500 groupBy $.destination
Run Code Online (Sandbox Code Playgroud)
实际上并不首先执行groupBy。实际上,将groupBy放置在其他任何地方都会引发错误(因为更改了groupBy之后的输出架构)。
对于显然为什么不是这样的情况,对于为何模块声明最后一个函数首先执行的问题,这里有何想法?
谢谢!
有没有一种方法可以自动处理夏令时?我正在使用以下转换
%dw 2.0
output application/json
---
{'date': now() >> "EST"}
Run Code Online (Sandbox Code Playgroud)
但输出是
{
"date": "2019-08-08T06:45:16.663-05:00"
}
Run Code Online (Sandbox Code Playgroud)
时区为-05:00
,但考虑到夏令时,我希望将其设为-04:00
我当前的有效载荷是(从POST接收)
<?xml version='1.0' encoding='ISO-8859-1'?>
<test>
</test>
Run Code Online (Sandbox Code Playgroud)
我想获取编码值(即ISO-8859-1
)
正确使用什么DataWeave表达式?
我已经测试过
var infos = payload.^mediaType splitBy "; "
var encoding = infos[1] splitBy "="
---
media:
{
mime: infos[0],
encoding: encoding[1]
}
Run Code Online (Sandbox Code Playgroud)
但它返回我:
{
"mime": "application/xml",
"encoding": "UTF-8"
}
Run Code Online (Sandbox Code Playgroud)
似乎payload.^mediaType
来自我的POST标头。
这是解决问题的方法:
%dw 2.0
output application/java
---
((payload.^raw as String) scan /encoding='([A-z0-9-]+)'/)[0][1]
Run Code Online (Sandbox Code Playgroud)
在提出的解决方案中,缺少^符号。