Golang根据JSON数据生成代码的工具推荐
Golang根据JSON数据生成代码的工具推荐 我有一个内部的 JSON 配置文件,我想将其转换为纯 Go 代码。出于练习的目的,我想生成一个包含类型和预填充变量的纯 Go 代码。我找到了许多在线工具,例如 json-to-go,但它们只生成类型(JSON 模式),而不是用 JSON 中的实际数据填充的变量。当然,我可以每次都从 JSON 中解组数据,但从实际使用的角度来看,我认为将配置直接放在 Go 代码中更容易,将来也更容易修改。这样的工具是否存在?或者是否有更好的替代方案来直接在 Go 代码中存放配置?
我不太确定我理解了这个问题;你能提供一个你正在寻找的最小示例吗?
更多关于Golang根据JSON数据生成代码的工具推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢你 @fea_kafea,但不幸的是,fmt.Printf 无法生成有效的 Go 代码,即使在你给出的示例输出中,你也能看到这一点。
抱歉,我一开始就应该提供一个例子,以下是我所说的意思,从这个JSON开始:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
使用 https://mholt.github.io/json-to-go/ 转换后,我得到了这个Go结构体:
type AutoGenerated struct {
UserID int `json:"userId"`
ID int `json:"id"`
Title string `json:"title"`
Completed bool `json:"completed"`
}
除了上述内容,我还在寻找相关的数据。我希望另一段Go代码能够自动生成,例如:
varAutoGenerated := AutoGenerated{
UserID: 1,
ID: 1,
Title: "delectus aut autem",
Completed: false,
}
这看起来是一个简单的例子,只需手动输入一次,但我实际的JSON配置包含数百行,并且有多层嵌套的结构体。
目前我找到的最接近的解决方案是使用这个库中的 render.AsCode 函数:https://github.com/gdexlab/go-render
这里有一个示例:https://play.golang.org/p/5mSaVRrnONy
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/gdexlab/go-render/render"
)
type AutoGenerated struct {
UserID int
ID int
Title string
Completed bool
}
func main() {
jsonStr :=
`
{
"UserID": 1,
"ID": 1,
"Title": "delectus aut autem",
"Completed": false
}
`
a := new(AutoGenerated)
err := json.Unmarshal([]byte(jsonStr), a)
if err != nil {
log.Fatal(err)
}
output := render.AsCode(a)
fmt.Println(output)
}
为了完善这个答案,我建议(对过去的自己说:)使用 json-to-go 来生成类型,然后在(解组之后)将结果渲染为代码。
对于将JSON数据直接转换为包含预填充变量的Go代码,确实有一些工具可以满足你的需求。以下是几个推荐:
- github.com/clipperhouse/jargon - 虽然主要用于自然语言处理,但其
jargon工具包含json2go命令,可以生成包含初始化数据的Go代码。
示例:
# 安装
go install github.com/clipperhouse/jargon/tools/jargon@latest
# 使用
echo '{"name": "test", "count": 42}' | jargon json2go -var config
输出:
var config = struct {
Name string `json:"name"`
Count int `json:"count"`
}{
Name: "test",
Count: 42,
}
- github.com/tmc/json-to-go - 这是json-to-go的本地版本,可以通过添加标志生成初始化代码:
// 安装后使用
json-to-go -init < input.json
- 自定义脚本 - 你也可以用Go快速写一个转换工具:
package main
import (
"encoding/json"
"fmt"
"go/format"
"os"
)
func main() {
var data interface{}
json.NewDecoder(os.Stdin).Decode(&data)
src := fmt.Sprintf(`
package config
var Config = %#v
`, data)
formatted, _ := format.Source([]byte(src))
fmt.Println(string(formatted))
}
使用方式:
go run convert.go < config.json
对于配置管理,如果希望配置直接嵌入代码中,这些工具能很好地将JSON转换为可直接编译的Go代码。不过需要注意,当配置频繁变化时,重新生成代码会增加构建步骤。


