You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

场景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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:57:03