OPA中遍历嵌套JSON并按Status分类生成列表的技术问询
正确的OPA Rego实现:按Status拆分列表
首先给出可直接运行的正确Rego代码:
package play # 收集所有Status为"Done"的Name done_list = [x.Name | x := input.data.list[_]; x.Status == "Done"] # 收集所有Status不为"Done"的Name(包括空字符串、null) other_list = [x.Name | x := input.data.list[_]; not x.Status == "Done"] # 定义测试返回结构 test_return = { "done_list": done_list, "other_list": other_list }
关键说明:
- 你尝试的列表推导式思路是对的,但需要修正语法细节:
- Rego中判断相等使用
==,单个=仅用于变量绑定,不能做相等判断 - 使用
not x.Status == "Done"比x.Status != "Done"更严谨,能覆盖Status为null、空字符串等所有非"Done"的场景 - 无需设置
default done_list := [],当没有匹配元素时,列表推导式会自动返回空列表,和默认值效果一致
- Rego中判断相等使用
为什么之前的append写法无效?
Rego是声明式语言,和命令式的Python逻辑不同,不存在append这种修改变量的操作。你需要通过声明规则来描述列表元素的条件,而非一步步执行添加动作。
测试输出
传入你提供的输入数据时,test_return会生成期望的结果:
{ "done_list": ["abc", "def"], "other_list": ["ghi", "jkl", "mno"] }
内容的提问来源于stack exchange,提问作者m12345
相关产品推荐
相关产品推荐

