golang map 保存json文件_Go语言操作json的技巧

本文详细介绍了Golang中处理json数据的技巧,包括json基本序列化、结构体标签tag的使用、指定字段名、忽略字段、处理字符串格式数字以及不确定层级的json格式处理。通过这些技巧,能更高效地进行json数据的转换和操作。
摘要由CSDN通过智能技术生成

cbfce9a2062e915ce6a97ba468c70986.png

本篇文章将会介绍我们平时在开发中会遇到的那些关于Golang操作json数据的技巧,主要是与结构体的一些转换。

json的基本序列化

Go语言中的序列号直接调用json.Marshal()即可与和反序列化调用json.Unmarshal即可,方法相对来说比较简单。

type Person struct {
Name string
Age int64
Weight float64
}

func main() {
p1 := Person{
Name: "七米",
Age: 18,
Weight: 71.5,
}
// struct -> json string
b, err := json.Marshal(p1)
if err != nil {
fmt.Printf("json.Marshal failed, err:%v\n", err)
return
}
fmt.Printf("str:%s\n", b)
// json string -> struct
var p2 Person
err = json.Unmarshal(b, &p2)
if err != nil {
fmt.Printf("json.Unmarshal failed, err:%v\n", err)
return
}
fmt.Printf("p2:%#v\n", p2)
}

输出:

str:{"Name":"七米","Age":18,"Weight":71.5}
p2:main.Person{Name:"七米", Age:18, Weight:71.5}

json与结构体标签tag

Tag标签是结构体的元信息,一般是在运行的时候通过反射的机制来读取出来。 Tag通常是在结构体字段的后方定义,用反引号包阔起来,其格式如下:

`key1:"value1" key2:"value2"`

结构体 标签 可以有多个键值对组成。键与值使用冒号分隔,值用双引号括起来。

json标签tag指定字段名

json的序列化与反序列化默认情况下会使用结构体的字段名,可以通过给结构体字段添加tag来指定json序列化生成的字段名。

// 使用json tag指定序列化与反序列化时的行为
type Person struct {
Name string `json:"name"` // 指定json序列化/反序列化时使用小写name
Age int64
Weight float64
}

json忽略字段

通常用在tag中添加-忽略掉结构体中的某个字段。

// 使用json tag指定json序列化与反序列化时的行为
type Person struct {
Name string `json:"name"` // 指定json序列化/反序列化时使用小写name
Age int64
Weight float64 `json:"-"` // 指定json序列化/反序列化时忽略此字段
}

使用优雅方式处理字符串格式的数字

有时候,前端在传递来的json数据中可能会使用字符串类型的数字,这个时候可以在结构体tag中添加string来告诉json包从字符串中解析相应字段的数据:

type Card struct {
ID int64 `json:"id,string"` // 添加string tag
Score float64 `json:"score,string"` // 添加string tag
}

func intAndStringDemo() {
jsonStr1 := `{"id": "1234567","score": "88.50"}`
var c1 Card
if err := json.Unmarshal([]byte(jsonStr1), &c1); err != nil {
fmt.Printf("json.Unmarsha jsonStr1 failed, err:%v\n", err)
return
}
fmt.Printf("c1:%#v\n", c1) // c1:main.Card{ID:1234567, Score:88.5}
}

不确定层级的json格式处理

在平时开发中可以使用json.RawMessage来保存原始字节数据,从而解决在没有固定的格式导致不好定义与其相对应的结构体的问题。

type sendMsg struct {
User string `json:"user"`
Msg string `json:"msg"`
}

func rawMessageDemo() {
jsonStr := `{"sendMsg":{"user":"q1mi","msg":"永远不要高估自己"},"say":"Hello"}`
// 定义一个map,value类型为json.RawMessage,方便后续更灵活地处理
var data map[string]json.RawMessage
if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
fmt.Printf("json.Unmarshal jsonStr failed, err:%v\n", err)
return
}
var msg sendMsg
if err := json.Unmarshal(data["sendMsg"], &msg); err != nil {
fmt.Printf("json.Unmarshal failed, err:%v\n", err)
return
}
fmt.Printf("msg:%#v\n", msg)
// msg:main.sendMsg{User:"q1mi", Msg:"永远不要高估自己"}
}

以上是关于Go语言操作json的介绍,感谢您的阅读,如有疑问或意见请及时反馈给我们。


上一篇文章:

数据库之分库分表的一些总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值