设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 一个人挺好的

一个人挺好的 -- 一个

查看: 1579|回复: 5

golang中json和struct的使用说明

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:240
  • 打卡月天数:0
  • 打卡总奖励:3591
  • 最近打卡:2025-04-06 05:37:13
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
423
主题
379
精华
0
金钱
4836
积分
882
注册时间
2023-1-5
最后登录
2025-4-6

发表于 2023-3-7 22:03:55 | 显示全部楼层 |阅读模式
1、返回json响应结果

在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的键名
  1. type SuccessResponse struct {
  2.    Code int         `json:"code"`
  3.    Msg  string      `json:"msg"`
  4.    Data interface{} `json:"data"`
  5. }
  6. func SuccessRsp(ctx *gin.Context, data interface{}) {
  7.    res := SuccessResponse{
  8.       Code: 0,
  9.       Msg:  "success",
  10.       Data: data,
  11.    }
  12.    ctx.JSON(http.StatusOK, res)
  13. }
  14. type MyData struct {
  15.    Id    int         `json:"id"`
  16.    Name  string      `json:"name"`
  17. }
  18. func ListAllOncallPlan(ctx *gin.Context)  {
  19.    //你的业务代码
  20.    //......
  21.    data = Mydata{Id:1, Name:"zhangsan"}
  22.    SuccessRsp(ctx, plans)
  23. }
  24. 响应的结果为:
  25. {
  26.    "code": 0,
  27.    "msg": "ok",
  28.    "data": {
  29.       "id": 1,
  30.       "name": "zhangsan"
  31.    }
  32. }
复制代码
tips:

1.如果struct的某个字段没有传值,则输出的json为默认值,可以通过"omitempty"参数忽略掉值为空的键
  1. type MyData struct {
  2.    Id    int         `json:"id,omitempty"`
  3.    Name  string      `json:"name"`
  4. }
  5. data = Mydata{Name:"zhangsan"}
  6. SuccessRsp(ctx, plans)
复制代码
则id的键会被忽略掉,输出json为:
  1. {
  2.    "code": 0,
  3.    "msg": "ok",
  4.    "data": {
  5.       "name": "zhangsan"
  6.    }
  7. }
复制代码
2.可以用"-"来完全掉忽略掉某个键, 比如下面的id不会被转化到json字段中
  1. type MyData struct {
  2.    Id    int         `json:"-"`
  3.    Name  string      `json:"name"`
  4. }
复制代码
2、将数据库的字段转化成struct

如果使用gorm框架进行数据库连接,则可以用gorm:"column:key"来指定数据库的键,如下所示
  1. type User struct {
  2.    Id          int64     `gorm:"column:id" json:"id"`
  3.    Name        string    `gorm:"column:name" json:"name,omitempty"`
  4. }
复制代码
补充:golang 一键生成 form,json,gorm标签
每次有新表产生时,就会有新的model,model编写完后,繁杂的标签注解令人烦躁,所以写了这样的工具。
  1. func AddJsonFormGormTag(in string) (string) {
  2.         var result string
  3.         scanner := bufio.NewScanner(strings.NewReader(in))
  4.         var oldLineTmp = ""
  5.         var lineTmp = ""
  6.         var propertyTmp = ""
  7.         var seperateArr []string
  8.         for scanner.Scan() {
  9.                 oldLineTmp = scanner.Text()
  10.                 lineTmp = strings.Trim(scanner.Text(), " ")
  11.                 if strings.Contains(lineTmp, "{") || strings.Contains(lineTmp, "}") {
  12.                         result = result + oldLineTmp + "\n"
  13.                         continue
  14.                 }
  15.                 seperateArr = Split(lineTmp, " ")
  16.                 // 接口或者父类声明不参与tag, 自带tag不参与tag
  17.                 if len(seperateArr) == 1 || len(seperateArr) == 3 {
  18.                         continue
  19.                 }
  20.                 propertyTmp = HumpToUnderLine(seperateArr[0])
  21.                 oldLineTmp = oldLineTmp + fmt.Sprintf("    `gorm:"column:%s" json:"%s" form:"%s"`", propertyTmp, propertyTmp, propertyTmp)
  22.                 result = result + oldLineTmp + "\n"
  23.         }
  24.         return result
  25. }
  26. // 增强型split,对  a,,,,,,,b,,c     以","进行切割成[a,b,c]
  27. func Split(s string, sub string) []string {
  28.         var rs = make([]string, 0, 20)
  29.         tmp := ""
  30.         Split2(s, sub, &tmp, &rs)
  31.         return rs
  32. }
  33. // 附属于Split,可独立使用
  34. func Split2(s string, sub string, tmp *string, rs *[]string) {
  35.         s = strings.Trim(s, sub)
  36.         if !strings.Contains(s, sub) {
  37.                 *tmp = s
  38.                 *rs = append(*rs, *tmp)
  39.                 return
  40.         }
  41.         for i, _ := range s {
  42.                 if string(s[i]) == sub {
  43.                         *tmp = s[:i]
  44.                         *rs = append(*rs, *tmp)
  45.                         s = s[i+1:]
  46.                         Split2(s, sub, tmp, rs)
  47.                         return
  48.                 }
  49.         }
  50. }
  51. // 驼峰转下划线
  52. func HumpToUnderLine(s string) string{
  53.         if s =="ID" {
  54.                 return "id"
  55.         }
  56.         var rs string
  57.         elements:=FindUpperElement(s)
  58.         for _,e :=range elements{
  59.                 s =strings.Replace(s, e, "_"+strings.ToLower(e),-1)
  60.         }
  61.         rs = strings.Trim(s," ")
  62.         rs = strings.Trim(rs,"\t")
  63.         return strings.Trim(rs,"_")
  64. }
  65. // 找到字符串中大写字母的列表,附属于HumpToUnderLine
  66. func FindUpperElement(s string) []string {
  67.         var rs = make([]string, 0, 10)
  68.         for i := range s {
  69.                 if s[i] >= 65 && s[i] <= 90 {
  70.                         rs = append(rs, string(s[i]))
  71.                 }
  72.         }
  73.         return rs
  74. }
复制代码
如何使用
  1. func TestAddJsonFormTag(t *testing.T) {
  2. rs := AddJsonFormGormTag(`
  3. type User struct{
  4.   Id        uint64
  5.   NameSpace  string
  6.   DailyRoutine int
  7. }
  8. `)
  9. fmt.Println(rs)
  10. }
复制代码
结果
  1. type User struct{
  2.   Id        uint64    `gorm:"column:id" json:"id" form:"id"`
  3.   NameSpace  string    `gorm:"column:name_space" json:"name_space" form:"name_space"`
  4.   DailyRoutine int    `gorm:"column:daily_routine" json:"daily_routine" form:"daily_routine"`
  5. }
复制代码
具体对齐,使用go fmt xxx.go 命令
goland 快捷键是 ctrl alt L
以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:22
  • 打卡月天数:0
  • 打卡总奖励:272
  • 最近打卡:2025-04-19 03:26:49
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
309
积分
46
注册时间
2023-1-19
最后登录
2025-4-19

发表于 2023-6-5 11:32:53 | 显示全部楼层
感谢大大分享~~~~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2023-8-24 10:21:59 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2023-8-24 19:54:05 | 显示全部楼层
感谢楼主分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-12-3
最后登录
2023-12-3

发表于 2024-8-22 22:02:40 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:19
  • 打卡月天数:0
  • 打卡总奖励:256
  • 最近打卡:2025-03-12 08:32:27
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
290
积分
40
注册时间
2023-3-6
最后登录
2025-3-12

发表于 2024-9-25 15:52:57 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表