json
golang数据类型序列化 json.Marshal()
// 演示glang数据类型序列化
package main
import (
"fmt"
"encoding/json"
"os"
)
type ColorGroup struct {
ID int
Name string
Colors []string
}
// struct序列化
func struct1(){
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()
}
// map序列化
func mp(){
var a map[string]interface{}
a = make(map[string]interface{})
a["大黄蜂"] = "赛博坦星球"
a["擎天柱"] = "地球"
b, err := json.Marshal(a)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
fmt.Println()
}
// slice序列化
func slice1(){
var slice []map[string]interface{}
var s1 map[string]interface{}
s1 = make(map[string]interface{})
s1["龙珠"] = "龙王"
s1["七龙珠"] = "七龙王"
slice = append(slice,s1)
var s2 map[string]interface{}
s2 = make(map[string]interface{})
s2["泰山"] = "五岳"
s2["华山"] = "武当"
slice = append(slice,s2)
b, err := json.Marshal(slice)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
fmt.Println()
}
func main(){
struct1()
mp()
slice1()
}
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
{"大黄蜂":"赛博坦星球","擎天柱":"地球"}
[{"七龙珠":"七龙王","龙珠":"龙王"},{"华山":"武当","泰山":"五岳"}]
基本数据类型序列化(意义不大)
// 基本数据类型序列化
func n1(){
var a int = 10001
b, err := json.Marshal(a)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
}
10001
注意事项:
- 对于结构体的序列化,如果我们希望序列化后的key的名字由我们自己指定那么可以给struct字段指定一个 tag 标签(原理反射)
- struct字段打tag语法:
// 演示反序列化
package main
import (
"fmt"
"encoding/json"
"os"
)
type person struct{
// 这种加个json tag的方式可以让浏览器选择自己喜欢的格式
// 反射机制
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func serialization(){
p := person{
Id : 1,
Name : "tom",
Age : 20,
}
b, err := json.Marshal(&p)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
fmt.Println()
}
func main(){
serialization()
}
- 可以看到结构体json序列化后的字段变为了小写
{"id":1,"name":"tom","age":20}在这里插入代码片
golang中json字符串反序列化
注意:
- 反序列化 map 不需要make,因为make操作被封装到了 Unmarshal 函数
- 在反序列化一个json字符串时,要确保反序列化后的数据类型和原来的序列化前数据类型一致
- 如果json字符串是通过程序本身获取到的则不需要再对json字符串转义处理
// 演示反序列化
package main
import (
"fmt"
"encoding/json"
// "os"
)
type person struct{
// 这种加个json tag的方式可以让浏览器选择自己喜欢的格式
// 反射机制
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
// 将json字符串反序列化为 struct
func serialization(){
P := "{\"Id\":1,\"Name\":\"tom\",\"Age\":20}" // 对原生json字符串转义处理
var p1 person
err := json.Unmarshal([]byte(P), &p1)
if err != nil{
fmt.Println("错误提示: ",err)
}
fmt.Println("反序列化为struct结果: ",p1)
}
// 将json字符串反序列化为 map
func serializationmap(){
P := "{\"Id\":1,\"Name\":\"tom\",\"Age\":20}"
var a1 map[string]interface{}
err := json.Unmarshal([]byte(P), &a1)
if err != nil{
fmt.Println("错误提示: ",err)
}
fmt.Println("反序列化为map结果 : ",a1)
}
// 将json字符串反序列化为 slice
func sliceserializaation(){
a := "[{\"七龙珠\":\"七龙王\",\"龙珠\":\"龙王\"}," +
"{\"华山\":\"武当\",\"泰山\":\"五岳\"}]"
var a1 []map[string]interface{}
err := json.Unmarshal([]byte(a),&a1)
if err != nil{
fmt.Println("错误提示: ",err)
}
fmt.Println("反序列化为slice结果 : ",a1)
}
func main(){
serialization()
serializationmap()
sliceserializaation()
}
反序列化为struct结果: {1 tom 20}
反序列化为map结果 : map[Id:1 Name:tom Age:20]
反序列化为slice结果 : [map[七龙珠:七龙王 龙珠:龙王] map[华山:武当 泰山:五岳]]