golang中json和struct的使用说明
程序员文章站
2022-03-08 18:52:09
1、返回json响应结果在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的键名type successresponse struct { code i...
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"` }
2、将数据库的字段转化成struct
如果使用gorm框架进行数据库连接,则可以用gorm:"column:key"来指定数据库的键,如下所示
type user struct { id int64 `gorm:"column:id" json:"id"` name string `gorm:"column:name" json:"name,omitempty"` }
补充:golang 一键生成 form,json,gorm标签
每次有新表产生时,就会有新的model,model编写完后,繁杂的标签注解令人烦躁,所以写了这样的工具。
func addjsonformgormtag(in string) (string) { var result string scanner := bufio.newscanner(strings.newreader(in)) var oldlinetmp = "" var linetmp = "" var propertytmp = "" var seperatearr []string for scanner.scan() { oldlinetmp = scanner.text() linetmp = strings.trim(scanner.text(), " ") if strings.contains(linetmp, "{") || strings.contains(linetmp, "}") { result = result + oldlinetmp + "\n" continue } seperatearr = split(linetmp, " ") // 接口或者父类声明不参与tag, 自带tag不参与tag if len(seperatearr) == 1 || len(seperatearr) == 3 { continue } propertytmp = humptounderline(seperatearr[0]) oldlinetmp = oldlinetmp + fmt.sprintf(" `gorm:\"column:%s\" json:\"%s\" form:\"%s\"`", propertytmp, propertytmp, propertytmp) result = result + oldlinetmp + "\n" } return result } // 增强型split,对 a,,,,,,,b,,c 以","进行切割成[a,b,c] func split(s string, sub string) []string { var rs = make([]string, 0, 20) tmp := "" split2(s, sub, &tmp, &rs) return rs } // 附属于split,可独立使用 func split2(s string, sub string, tmp *string, rs *[]string) { s = strings.trim(s, sub) if !strings.contains(s, sub) { *tmp = s *rs = append(*rs, *tmp) return } for i, _ := range s { if string(s[i]) == sub { *tmp = s[:i] *rs = append(*rs, *tmp) s = s[i+1:] split2(s, sub, tmp, rs) return } } } // 驼峰转下划线 func humptounderline(s string) string{ if s =="id" { return "id" } var rs string elements:=findupperelement(s) for _,e :=range elements{ s =strings.replace(s, e, "_"+strings.tolower(e),-1) } rs = strings.trim(s," ") rs = strings.trim(rs,"\t") return strings.trim(rs,"_") } // 找到字符串中大写字母的列表,附属于humptounderline func findupperelement(s string) []string { var rs = make([]string, 0, 10) for i := range s { if s[i] >= 65 && s[i] <= 90 { rs = append(rs, string(s[i])) } } return rs }
如何使用
func testaddjsonformtag(t *testing.t) { rs := addjsonformgormtag(` type user struct{ id uint64 namespace string dailyroutine int } `) fmt.println(rs) }
结果
type user struct{ id uint64 `gorm:"column:id" json:"id" form:"id"` namespace string `gorm:"column:name_space" json:"name_space" form:"name_space"` dailyroutine int `gorm:"column:daily_routine" json:"daily_routine" form:"daily_routine"` }
具体对齐,使用go fmt xxx.go 命令
goland 快捷键是 ctrl alt l
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。