JSONata表达式报错修正:为指定API路径的policies数组追加元素
修正JSONata表达式实现Kubernetes JSON对象的数组追加操作
需求说明
需要给Kubernetes相关JSON对象中api_path为"v1/ldap"的条目里的policies数组追加"delete"元素。
原JSON对象
{ "_namespace": "kubernetes", "api_paths": [ { "api_action": "post", "api_path": "v1/ldap", "api_payload": { "policies": [ "reader", "writer", "encrypt", "decrypt" ] } } ] }
期望结果
{ "_namespace": "kubernetes", "api_paths": [ { "api_action": "post", "api_path": "v1/ldap", "api_payload": { "policies": [ "reader", "writer", "encrypt", "decrypt", "delete" ] } } ] }
错误表达式及报错信息
当前报错的JSONata表达式
$ ~> | { "api_paths": $map(function($path) { if ($path.api_path["v1/ldap"]) { return $merge([$path, { "api_payload": $merge([$path.api_payload, { "policies": $append(api_payload.policies, "delete") }]) }]) } else { return $path } }) }
报错信息(翻译后)
期望":",却得到"merge"
修正后的JSONata表达式
简洁版(推荐)
利用JSONata路径选择器直接定位目标数组,操作更高效:
$ ~> | api_paths[api_path = "v1/ldap"].api_payload.policies | $append($, "delete") |
遍历数组兼容版
$ ~> | api_paths | function($path) { $path.api_path = "v1/ldap" ? $merge([$path, { "api_payload": $merge([$path.api_payload, { "policies": $append($path.api_payload.policies, "delete") }]) }]) : $path } |
修复说明
- 修正条件判断逻辑:原表达式用
$path.api_path["v1/ldap"]的数组索引写法错误,需改为$path.api_path = "v1/ldap"进行字符串相等判断 - 修正变量引用上下文:
$append中的api_payload.policies未指定当前遍历项,需改为$path.api_payload.policies,确保引用正确的对象属性 - 规范transform操作符语法:原表达式的transform结构不符合JSONata语法规范,正确格式应为
$ ~> | <目标路径> | <处理函数> |,或直接通过路径定位目标元素修改 - 优化数组遍历方式:推荐直接使用
api_paths[api_path = "v1/ldap"]路径选择器定位目标条目,避免冗余遍历,提升效率
内容的提问来源于stack exchange,提问作者Venkat Akurathi
相关产品推荐
相关产品推荐

