[Go - Note] go中json序列化(Encode)和反序列化(Decode)以及struct tag

Arboat · · 1926 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

import "encoding/json"

struct tag

可以选择的控制字段有几种:

*   `-`:不要解析这个字段
*   `omitempty`:当字段为空(默认值)时,不要解析这个字段。比如 false、0、nil、长度为 0 的 array,map,slice,string
*   `FieldName`:当解析 json 的时候,使用这个名字
*   type,有些时候,我们在序列化或者反序列化的时候,可能结构体类型和需要的类型不一致,这个时候可以指定,支持string,number和boolean,array,object

Encode

func Marshal(v interface{}) ([]byte, error)

  • omitempty: struct字段若有次tag,序列化时若为零值则在结果中忽略次字段

Decode

func Unmarshal(data []byte, v interface{}) error

  • 区分nil和zeroValue:对零值非nil字段可用在构造的struct中用指针方式检验对应字段是否存在和零值

反射获取tag内容

type User struct {
     UserId   int    `json:"user_id" bson:"user_id" test:"test"`
    UserName string `json:"user_name" bson:"user_name"`}
获取tag中test的值

复制代码
 // 获取tag中的内容
 typeof := reflect.TypeOf(u)
 field := typeof.Elem().Field(0)
 fmt.Println(field.Tag.Get("json"))
 // 输出:user_id
 fmt.Println(field.Tag.Get("bson"))
 // 输出:user_id
 fmt.Println(field.Tag.Get("test"))
 // 输出:test

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1926 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传