如何使用Go的rego包将rego格式策略转换为JSON格式
Rego策略转JSON的Go实现方案
核心实现路径(基于OPA官方Go包)
- 直接使用OPA官方维护的Go SDK即可实现,无需引入第三方工具,核心依赖两个包:
- 转换Rego策略本身的结构化AST为JSON:
github.com/open-policy-agent/opa/ast - 转换Rego策略的求值运行结果为JSON:
github.com/open-policy-agent/opa/rego
- 转换Rego策略本身的结构化AST为JSON:
场景1:Rego策略语法结构转JSON
如果你需要把Rego文件的包定义、导入声明、规则、注释等所有语法元素转换为结构化JSON,直接解析为AST后序列化即可,ast.Module原生实现了json.Marshaler接口:
package main import ( "encoding/json" "os" "github.com/open-policy-agent/opa/ast" ) func main() { // 读取本地Rego策略文件 regoRaw, err := os.ReadFile("./example.rego") if err != nil { panic(err) } // 解析Rego内容为AST模块对象 module, err := ast.ParseModule("example.rego", string(regoRaw)) if err != nil { panic(err) } // 序列化为带缩进的JSON格式 jsonResult, err := json.MarshalIndent(module, "", " ") if err != nil { panic(err) } // 写入JSON文件 if err = os.WriteFile("./policy_ast.json", jsonResult, 0644); err != nil { panic(err) } }
如果不需要完整的AST节点信息,可自行遍历module的Package、Imports、Rules等字段,自定义结构体提取需要的内容后再序列化,减少输出冗余。
场景2:Rego策略执行结果转JSON
如果你需要的是Rego策略对输入数据求值后的结果转JSON,使用rego包构造查询执行即可:
package main import ( "context" "encoding/json" "os" "github.com/open-policy-agent/opa/rego" ) func main() { // 构造Rego查询,加载策略文件、指定查询路径 query := rego.New( rego.Load([]string{"./example.rego"}, nil), rego.Query("data.example.allow"), ) // 传入上下文和输入数据执行查询 resultSet, err := query.Eval(context.Background(), rego.EvalInput(map[string]interface{}{ "user": "admin", "action": "delete", })) if err != nil { panic(err) } // 直接序列化结果集为JSON jsonResult, err := json.MarshalIndent(resultSet, "", " ") if err != nil { panic(err) } os.WriteFile("./eval_result.json", jsonResult, 0644) }
内容的提问来源于stack exchange,提问作者vnn
相关产品推荐
相关产品推荐

