如何用JSONata将外部邮箱数据添加到现有通讯对象数组
使用JSONata将外部数据合并到现有数组的解决方案
问题描述
如何使用JSONata将外部数据添加到现有数组中?现有一个电话号码数组,需将合并后的结果命名为communication,同时将数组外的邮箱作为通讯类型加入到这个数组里。
原始数据
{ "customer": { "email": "joe@home.com", "doNotEmail": "true", "phones": [ { "key": "0", "number": "2222222222", "preferredContactTime": "UNKNOWN", "sendTextMessages": false, "type": "HOME" }, { "key": "1", "number": "3333333333", "preferredContactTime": "UNKNOWN", "sendTextMessages": false, "type": "HOME" }, { "key": "2", "number": "2222222222", "preferredContactTime": "UNKNOWN", "sendTextMessages": false, "type": "HOME" } ] } }
尝试的代码
"communication": $append(customer.phones.{ "channelType": "Phone", "channelCode": type, "completeNumber": number },{$$.customer.email, $$.customer.privacy.okToContact),
期望输出
{ "communication": [ { "emailAddress": "joe@home.com", "channelType": "Email", "channelCode": "Personal", "privacy": [ { "okToContact": true } ] }, { "channelType": "Phone", "channelCode": "Home", "completeNumber": "222-222-2222" }, { "channelType": "Phone", "channelCode": "Home", "completeNumber": "333-333-3333" }, { "channelType": "Phone", "channelCode": "Home", "completeNumber": "222-222-2222" } ] }
解决方案
你之前的代码问题在于$append的第二个参数没有构造正确的对象结构,且缺少号码格式化、字段转换的逻辑。以下是符合需求的JSONata表达式:
{ "communication": [ { "emailAddress": customer.email, "channelType": "Email", "channelCode": "Personal", "privacy": [ { "okToContact": $not($boolean(customer.doNotEmail)) } ] } ] & customer.phones.{ "channelType": "Phone", "channelCode": $lowercase(type), "completeNumber": $replace(number, /(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") } }
关键逻辑说明
- 邮箱对象构造:根据原始数据的
email和doNotEmail字段,构造符合期望格式的邮箱通讯项,其中okToContact通过$not($boolean(customer.doNotEmail))将字符串类型的doNotEmail转为布尔值后取反,匹配期望输出的逻辑。 - 电话号码处理:遍历原始
phones数组,对每个对象做字段映射:- 将
type字段转为小写(如HOME→Home) - 用正则表达式
$replace给10位电话号码添加分隔符,格式化为XXX-XXX-XXXX
- 将
- 数组合并:使用JSONata的
&运算符,直接将邮箱对象数组与处理后的电话号码数组合并,实现把外部邮箱数据加入现有数组的需求。
内容的提问来源于stack exchange,提问作者Tim Morford
相关产品推荐
相关产品推荐

