前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go:json使用的小tips

Go:json使用的小tips

作者头像
灰子学技术
发布2021-01-06 11:25:08
3730
发布2021-01-06 11:25:08
举报
文章被收录于专栏:灰子学技术灰子学技术

写在前面的话:

最近在使用json的时候,发现有一些场景需要对struct tag做一些特殊处理,不然的话,很难去支持。

基于上面的原因,笔者稍微做了整理,算是一些小技巧,希望对你有用,场景如下所示:

场景1: 只希望使用strcut里面的名称,不希望json.Marshal的时候,将struct tag编进去。此时我们应该使用"-"来操作。

场景2: 希望struct里面的名称,在初始化为0,“”, nil的时候,json.Marshal不编码进去。此时我们应该使用“omitempty”来操作。

例子如下所示:

package main
import (
  "encoding/json"
  "fmt"
  "os"
)

type Node struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}
// test里面是我们平时使用最多的方法,指定struct tag
func test() {
  n := Node{Name: "Davis", Age: 18}
  b, err := json.Marshal(n)
  if err != nil {
    fmt.Println("error:", err)
  }
  os.Stdout.Write(b)
  fmt.Print("\n")
}

type Node1 struct {
  Name string `json:"name"`
  Age  int    `json:"-"`
}
// test1里面是“-”的使用例子
func test1() {
  n := Node1{Name: "Davis", Age: 18}
  b, err := json.Marshal(n)
  if err != nil {
    fmt.Println("error:", err)
  }
  os.Stdout.Write(b) // 编码出来看不到age了,
  fmt.Print("\n")
  fmt.Println("age", n.Age) // 这里的n.Age是可以正常使用的
}

type Node2 struct {
  Name string `json:"name"`
  Age  int    `json:"age,omitempty"`
}
// test2是omitempty的使用例子
func test2() {
  n := Node2{Name: "Davis", Age: 18}
  b, err := json.Marshal(n) 
  if err != nil {
    fmt.Println("error:", err)
  }
  os.Stdout.Write(b) // Age的数值不是初始化的时候,可以正常编码
  fmt.Print("\n")
  n.Age = 0 // Age变为0之后,就不会被编码了
  b, err = json.Marshal(n)
  os.Stdout.Write(b)
  fmt.Print("\n")
}
func main() {

  test()
  fmt.Println("------------")
  test1()
  fmt.Println("------------")
  test2()
}

输出:

{"name":"Davis","age":18}
------------
{"name":"Davis"} // 看不到age
age 18
------------
{"name":"Davis","age":18} // 可以看到age = 18
{"name":"Davis"} // age =0,不会编码
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档