DataWeave去手机号非数字脚本在Anypoint Studio报错:为何update需schema?
问题场景
- 开发目标:编写DataWeave脚本清除
PhoneNumber字段内的所有非数字字符 - 运行差异:相同脚本在最新版DataWeave Playground可正常运行,在版本为7.4.2(Build Id: 202001311805)的Anypoint Studio中抛出解析错误
- 入站负载结构:
{ "Recipient": { "Name": "Bob Newhart", "MailingAddress": { "Line1": "123 Main Street", "Line2": "Apt 5", "City": "Cumming", "State": "GA", "ZipCode": "30009", "ZipCodePlus4": "3382" }, "PhoneNumber": "(999) 555-1234", "Company": "Disney" } }
- 触发错误的原始脚本:
%dw 2.0 output application/json --- ( payload: payload update {case .Recipient.PhoneNumber -> replace (payload.Recipient.PhoneNumber, /\D/) with ""} ).payload
- Studio抛出的错误信息:Invalid input "update {case ", expected schema or & (line 6, column 20)
- 核心疑问:为什么
update语句会触发需要schema的校验要求?
错误根因
该报错并非逻辑层触发了输入负载的schema校验流程,本质是不同版本DataWeave的语法演进差异导致的解析失败:
- DataWeave的对象修改操作符经历了多轮语法调整:
- 早期2.0/2.1版本使用
对象 update { 字段名: 新值 }的语法,update后必须跟随一个纯键值对形式的对象结构定义(即解析器提示中提到的“schema”) - 2.2版本将
update操作符正式重命名为with,暂保留update的语法兼容,但仍不支持块内的case分支写法 - 2.3及以上版本对
with操作符做了升级,才支持块内使用case .字段路径 -> 新值的嵌套字段选择语法
- 早期2.0/2.1版本使用
- 7.4.2版本Anypoint Studio内置的2.2.x版本DataWeave,解析器遇到
update {case片段时,会按照旧语法规则预期看到纯键值对的schema结构,遇到非预期的case关键字就直接抛出解析错误 - DataWeave Playground搭载最新版DataWeave,因此可以正常运行带
case分支的update块写法
兼容旧版Studio的可运行方案
放弃需要高版本支持的update {case ...}块语法,使用从DataWeave 2.0早期就支持的with操作符重构对象结构,同时删除原始脚本中冗余的对象包裹逻辑,可正常在该版本Studio中运行:
%dw 2.0 output application/json --- payload with ( Recipient = Recipient with ( PhoneNumber = PhoneNumber replace /\D/ with "" ) )
内容的提问来源于stack exchange,提问作者user245029
相关产品推荐
相关产品推荐

