使用JSONata转换对象数组并重命名字段时遇问题,求解决方案
解决JSONata重命名数组对象字段的问题
问题核心
你尝试用JSONata处理客户地址数组时,遇到两个关键问题:
- 字段值被打包成数组(比如
lineOne变成["MY HOUSE1","SUITE 11-1111"]):这是因为直接跨数组层级取字段(比如customers.addresses.addressLine1),JSONata会自动收集所有匹配元素形成数组,而非逐个对象处理。 - 条件判断逻辑错误:表达式1里的写法完全不符合JSONata语法,混淆了键值映射逻辑,
$key ? 'addressType' : 'addressType:' $value这种写法既不是合法的条件判断,也无法实现字段重命名。
正确的JSONata表达式
{ "customers": customers.$map(function($customer) { { "title": $customer.title, "givenName": $customer.firstName, "middleName": $customer.middleName, "familyName": $customer.lastName, "nameSuffix": $customer.suffix, "addresses": $customer.addresses.$map(function($addr) { { "addressType": $addr.addressType, "lineOne": $addr.addressLine1, "lineTwo": $addr.addressLine2, "cityName": $addr.city, "stateOrProvinceCountrySubDivisionId": $addr.state, "postCode": $addr.zip, "countyCountrySubDivision": $addr.county, "countryId": $addr.countryCode, "privacy": [ { "okToContact": $addr.sendMail } ] } }) } }) }
表达式说明
- 逐层遍历数组:用
$map分别遍历外层的customers数组和内层的addresses数组,确保每个对象单独处理,避免字段值被聚合为数组。 - 字段直接映射:
- 客户层面:将
firstName→givenName、lastName→familyName、suffix→nameSuffix,保留需要的字段。 - 地址层面:按需求重命名所有地址字段,比如
addressLine1→lineOne、countryCode→countryId等。
- 客户层面:将
- 结构转换:把原有的
sendMail布尔值,包装成privacy数组嵌套对象的形式。 - 自动过滤冗余字段:只保留你显式定义的字段,原数据中的
key等无用字段会被自动忽略。
执行该表达式后,输出结果将完全匹配你给出的期望格式。
内容的提问来源于stack exchange,提问作者Tim Morford
相关产品推荐
相关产品推荐

