golang中json和struct的使用说明

作者:springlustre 时间:2023-10-09 13:09:10 

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

以上为个人经验,希望能给大家一个参考

来源:https://blog.csdn.net/springlustre/article/details/88703929

标签:golang,json,struct
0
投稿

猜你喜欢

  • python编程学习np.float 被删除的问题解析

    2021-10-26 23:43:17
  • 详解设计模式中的工厂方法模式在Python程序中的运用

    2022-11-14 01:06:58
  • 教女朋友学Python3(二)简单的输入输出及内置函数查看 <font color=red>原创</font>

    2022-11-14 08:32:18
  • vue之组件内监控$store中定义变量的变化详解

    2023-07-02 17:01:31
  • python实现推箱子游戏

    2023-08-26 14:22:39
  • 如何安装绿色版MySQL Community Server 5.7.16并实现远程登录

    2024-01-14 13:02:03
  • JS事件在IE与FF中的区别详细解析

    2023-09-24 23:02:35
  • 使用python+whoosh实现全文检索

    2021-01-04 05:29:46
  • Python安装selenium包详细过程

    2023-04-12 00:05:31
  • python实现比较两段文本不同之处的方法

    2021-01-29 17:53:43
  • vue2.0.js的多级联动选择器实现方法

    2024-04-28 09:23:37
  • python 多线程中join()的作用

    2022-11-27 12:24:24
  • 讲解SQL Server 2005数据库的同义词Bug

    2008-11-28 14:22:00
  • python sklearn包——混淆矩阵、分类报告等自动生成方式

    2022-05-29 12:19:27
  • python自动分箱,计算woe,iv的实例代码

    2022-10-13 22:51:50
  • 如何将自己的python代码发布在pip install给别人使用你知道吗

    2022-07-19 20:36:21
  • 关于ASP代码的加密

    2007-10-15 12:30:00
  • Python实现链表反转的方法分析【迭代法与递归法】

    2021-07-07 17:56:37
  • OpenAI的Whisper模型进行语音识别使用详解

    2022-02-24 23:50:51
  • 终结IE6下背景图片闪烁问题

    2009-03-04 10:11:00
  • asp之家 网络编程 m.aspxhome.com