如何在JSONata中原地迭代修改对象内嵌套数组的amount属性
如何在JSONata中修改嵌套数组字段并保留完整对象结构?
问题背景
我有一个JSON对象,其中policyList是数组类型,它的每个元素下包含product数组。我需要修改product数组中每个对象的amount值,但当前编写的表达式只能输出修改后的amount数组,无法保留完整的原对象结构。
原始JSON数据
{"admissionDate": "2023-10-04","claimCaseId": 123,"claimCaseStatusDescp": "Waiting","claimTypeDescp": "Hospitalization","dischargeDate": "2023-10-20","hospital": "abc","policyList": [{"policyNo": "P1","product": [{"amount": 10243,"claimDecision": "7","claimDecisionDescp": "Pending","productName": "Auto"},{"amount": 1023,"claimDecision": "7","claimDecisionDescp": "Pending","productName": "Mob"},{"amount": 100000,"claimDecision": "8","claimDecisionDescp": "Approved","productName": "PA"}]}],"reasonCode": ""}
错误表达式及当前输出
我之前写的表达式:
$map($.policyList.product.amount, function($amount) { $formatNumber($amount,'#,###') })
当前输出(仅得到格式化后的amount数组):
["10,243","1,023","100,000"]
期望输出
需要保留完整原对象结构,仅更新product中的amount值:
{"admissionDate": "2023-10-04","claimCaseId": 123,"claimCaseStatusDescp": "Waiting","claimTypeDescp": "Hospitalization","dischargeDate": "2023-10-20","hospital": "abc","policyList": [{"policyNo": "P1","product": [{"amount": "10,243","claimDecision": "7","claimDecisionDescp": "Pending","productName": "Auto"},{"amount": "1,023","claimDecision": "7","claimDecisionDescp": "Pending","productName": "Mob"},{"amount": "100,000","claimDecision": "8","claimDecisionDescp": "Approved","productName": "PA"}]}],"reasonCode": ""}
解决方案
使用JSONata的变换操作符(~>)结合数组遍历,实现只修改目标字段、保留其余结构的效果:
正确的JSONata表达式
$ ~> |policyList|{ "product": $map(product, function($item) { $item ~> |{"amount": $formatNumber($item.amount, "#,###")}| }) }|
表达式说明
$ ~> |policyList|{...}|:对根对象的policyList数组进行变换,遍历数组中的每个元素。- 对每个
policyList元素,重新定义product字段:用$map遍历原product数组。 $item ~> |{"amount": ...}|:对每个product对象,仅更新amount字段(用$formatNumber格式化),其余字段自动保留原始值。
这样就能在修改amount的同时,完整保留整个JSON对象的结构。
内容的提问来源于stack exchange,提问作者Himanshu Rai
相关产品推荐
相关产品推荐

