Golang根据JSON数据生成代码的工具推荐

Golang根据JSON数据生成代码的工具推荐 我有一个内部的 JSON 配置文件,我想将其转换为纯 Go 代码。出于练习的目的,我想生成一个包含类型和预填充变量的纯 Go 代码。我找到了许多在线工具,例如 json-to-go,但它们只生成类型(JSON 模式),而不是用 JSON 中的实际数据填充的变量。当然,我可以每次都从 JSON 中解组数据,但从实际使用的角度来看,我认为将配置直接放在 Go 代码中更容易,将来也更容易修改。这样的工具是否存在?或者是否有更好的替代方案来直接在 Go 代码中存放配置?

6 回复

我不太确定我理解了这个问题;你能提供一个你正在寻找的最小示例吗?

更多关于Golang根据JSON数据生成代码的工具推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢你 @fea_kafea,但不幸的是,fmt.Printf 无法生成有效的 Go 代码,即使在你给出的示例输出中,你也能看到这一点。

据我所知,以下是将Go语言从“json”代码进行转换的代码:

package main

import (
  "encoding/json"
  "fmt"
  "log"
)

type AutoGenerated struct {
  UserID    int
  ID        int
  Title     string
  Completed bool
}

func main(){
  jsoncodes := 
  `
    {
      "UserID": 1,
      "ID": 1,
      "Title": "delectus aut autem",
      "Completed": false
    }
  `
  a := new(AutoGenerated)
  err := json.Unmarshal([]byte(jsoncodes),a)
  if err != nil {
	log.Fatal(err)
  }
  fmt.Printf("%+v\n",a)//&{UserID:1 ID:1 Title:delectus aut autem Completed:false}//&{UserID:1 ID:1 Title:delectus aut autem Completed:false}
}

由于我不太擅长解释,我将省略细节。 真的非常抱歉。

抱歉,我一开始就应该提供一个例子,以下是我所说的意思,从这个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代码,确实有一些工具可以满足你的需求。以下是几个推荐:

  1. 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,
}
  1. github.com/tmc/json-to-go - 这是json-to-go的本地版本,可以通过添加标志生成初始化代码:
// 安装后使用
json-to-go -init < input.json
  1. 自定义脚本 - 你也可以用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代码。不过需要注意,当配置频繁变化时,重新生成代码会增加构建步骤。

回到顶部