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有没有好工具的主要内容,如果未能解决你的问题,请参考以下文章

[转] golang中structjsonmap互相转化

golang struct, map, json 之间的相互转换

Golang xorm工具,根据数据库自动生成 go 代码

golang struct转map

golang golang构造结合struct json

golang中json和struct的使用