Go 序列化

摘要:Golang的json包 - 飞鸿影 - 博客园

摘要2:Go的json解析:Marshal与Unmarshal_滢光点点-CSDN博客_json.marshal

encoding/json包

encoding/json是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码。使用的时候需要预定义struct,原理是通过reflectioninterface来完成工作, 性能低。

常用的接口:

  • func Marshal(v interface{}) ([]byte, error) 生成JSON
  • func Unmarshal(data []byte, v interface{}) error 解析JSON到struct

示例1 序列化:

type ColorGroup struct {
    ID     int
    Name   string
    Colors []string
}

group := ColorGroup{
    ID:     1,
    Name:   "Reds",
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}

b, err := json.Marshal(group)
if err != nil {
    fmt.Println("error:", err)
}

os.Stdout.Write(b)

输出:

{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}

示例2 反序列化:

var jsonBlob = []byte(`[
	{"Name": "Platypus", "Order": "Monotremata"},
	{"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`)

type Animal struct {
    Name  string
    Order string
}
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
    fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)

输出:

[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

示例3 序列化标签:

type ColorGroup struct {
    ID     int `json: id`
    Name   string `json: name`
    Colors []string `json: colors`
}

group := ColorGroup{
    ID:     1,
    Name:   "Reds",
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}

b, err := json.Marshal(group)
if err != nil {
    fmt.Println("error:", err)
}

// os.Stdout.Write(b)
fmt.Println(string(b))

输出:

{"id":1,"name":"Reds","colors":["Crimson","Red","Ruby","Maroon"]}

示例4 序列化标签:

序列化时,通过标签,指定忽略某个字段:`json:"-"`

注意:序列化操作中,不能序列化chan类型数据,否则报错

type ColorGroup struct {
    ID     int `json: id`
    Name   string `json: name`
    Colors []string `json: colors`
    
    Data   <-chan bool `json:"-"`   // 序列化时忽略该字段,定义一个只能接收的chan
    Data1  chan *Class `json:"-"`   // 定义chan
}

var (
    Class chan bool
)

group := ColorGroup{
    ID:     1,
    Name:   "Reds",
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}

b, err := json.Marshal(group)
if err != nil {
    fmt.Println("error:", err)
}

// os.Stdout.Write(b)
fmt.Println(string(b))

输出:

{"id":1,"name":"Reds","colors":["Crimson","Red","Ruby","Maroon"]}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值