欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。