json转golang struct有没有好工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json转golang struct有没有好工具相关的知识,希望对你有一定的参考价值。
参考技术A 用标准库也就二三十行的事情package main
import (
"encoding/json"
"fmt"
"go/format"
"go/types"
"regexp"
"strings"
)
func main()
nameSep := regexp.MustCompile(`[-_]`)
fixName := func(name string) string
parts := nameSep.Split(name, -1)
for i, part := range parts
parts[i] = strings.Title(part)
return strings.Join(parts, "")
var genType func(interface) types.Type
genType = func(v interface) types.Type
if v == nil
return types.NewInterface([]*types.Func, []*types.Named)
switch v := v.(type)
case float64:
return types.Typ[types.Float64]
case string:
return types.Typ[types.String]
case []interface:
if len(v) > 0
return types.NewSlice(genType(v[0]))
return types.NewSlice(genType(nil))
case map[string]interface:
var fields []*types.Var
var tags []string
for name, elem := range v
fields = append(fields, types.NewField(0, nil, fixName(name), genType(elem), false))
tags = append(tags, `json:"`+name+`"`)
return types.NewStruct(fields, tags)
panic(fmt.Errorf("bad json value: %T\n", v))
j := `
"menu":
"id": "file",
"value": "File",
"popup":
"menuitem": [
"value": "New", "onclick": "CreateNewDoc()",
"value": "Open", "onclick": "OpenDoc()",
"value": "Close", "onclick": "CloseDoc()"
],
"foo-bar": []
`
var v interface
if err := json.Unmarshal([]byte(j), &v); err != nil
panic(err)
src := `var J ` + types.TypeString(genType(v), nil)
formatted, err := format.Source([]byte(src))
if err != nil
panic(err)
fmt.Printf("%s\n", formatted)
输出
var J struct
Menu struct
Id string "json:\"id\""
Value string "json:\"value\""
Popup struct
Menuitem []struct
Value string "json:\"value\""
Onclick string "json:\"onclick\""
"json:\"menuitem\""
FooBar []interface "json:\"foo-bar\""
"json:\"popup\""
"json:\"menu\""
本回答被提问者采纳 参考技术B
试试这个工具https://toolb.cn/json2go 可以在线把JSON转成golang struct
golang中json和struct的使用
golang中json和struct的使用
1、返回json响应结果
在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的键名
type SuccessResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
func SuccessRsp(ctx *gin.Context, data interface{}) {
res := SuccessResponse{
Code: 0,
Msg: "success",
Data: data,
}
ctx.JSON(http.StatusOK, res)
}
type MyData struct {
Id int `json:"id"`
Name string `json:"name"`
}
func ListAllOncallPlan(ctx *gin.Context) {
//你的业务代码
//......
data = Mydata{Id:1, Name:"zhangsan"}
SuccessRsp(ctx, plans)
}
响应的结果为:
{
"code": 0,
"msg": "ok",
"data": {
"id": 1,
"name": "zhangsan"
}
}
tips:
1.如果struct的某个字段没有传值,则输出的json为默认值,可以通过"omitempty"参数忽略掉值为空的键
type MyData struct {
Id int `json:"id,omitempty"`
Name string `json:"name"`
}
data = Mydata{Name:"zhangsan"}
SuccessRsp(ctx, plans)
则id的键会被忽略掉,输出json为:
{
"code": 0,
"msg": "ok",
"data": {
"name": "zhangsan"
}
}
2.可以用"-"来完全掉忽略掉某个键, 比如下面的id不会被转化到json字段中
type MyData struct {
Id int `json:"-"`
Name string `json:"name"`
}
1
2
3
4
2、将数据库的字段转化成struct
如果使用gorm框架进行数据库连接,则可以用gorm:"column:key"来指定数据库的键,如下所示
type User struct {
Id int64 `gorm:"column:id" json:"id"`
Name string `gorm:"column:name" json:"name,omitempty"`
}
原文链接:https://blog.csdn.net/springlustre/java/article/details/88703929
以上是关于json转golang struct有没有好工具的主要内容,如果未能解决你的问题,请参考以下文章