能否在不使用对象构造的情况下,用JSONATA排除深层嵌套字段?
在JSONATA中无需手动构造对象即可排除深层嵌套字段?
问题背景
给定以下JSON数据:
{ "collection": [ { "id": "ABC", "learningunit": { "metadata": { "show": true, "unitType": { "code": "U", "value": "Unit" } } } }, { "id": "UYE", "learningunit": { "metadata": { "show": false, "unitType": { "code": "C", "value": "COURSE" } } } } ] }
需要移除show和value两个深层嵌套字段,得到目标结构:
{ "collection": [ { "id": "ABC", "learningunit": { "metadata": { "unitType": { "code": "U" } } } }, { "id": "UYE", "learningunit": { "metadata": { "unitType": { "code": "C" } } } } ] }
当前通过手动逐层构造对象的方式可以实现,但当JSON结构复杂时,这种写法会非常冗长繁琐:
{"collection":collection. { "id": id, "learningunit": learningunit. { "metadata": metadata. { "unitType": unitType. { "code": code } } } } }
可行方案:使用JSONATA删除操作符
完全可以不用手动构造对象,用JSONATA的**删除操作符~**配合转换操作符~>就能快速移除指定字段,表达式简洁高效:
写法一:分两次指定路径删除
~> | collection[*].learningunit.metadata | ~"show" | ~> | collection[*].learningunit.metadata.unitType | ~"value" |
写法二:链式复用上下文删除
~> | collection[*].learningunit.metadata | ~"show" | ~> $ | .unitType | ~"value" |
原理说明
~>是JSONATA的转换操作符,用于对指定目标节点执行修改操作| 目标路径 |定位到需要修改的嵌套节点,比如collection[*].learningunit.metadata表示遍历collection数组中每个元素的learningunit.metadata节点~"字段名"表示删除该节点下对应的字段,保留其他所有原有结构
这种方式无需重构整个对象,只需针对要删除的字段添加对应规则即可,结构越复杂,优势越明显。
内容的提问来源于stack exchange,提问作者Dang Bui
相关产品推荐
相关产品推荐

