首先定义一个结构体,并给每个属性赋予 json 标签,(Json是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。)代码如下:
type Movie struct {
Title string `json:"title"` //想换成json
Year int `json:"year"`
Price int `json:"rmb"`
Actors []string `json:"actors"` //演员切片
}
接下来我们来一起看一下编码的过程,通过使用 json.Marshal ()方法,将数据编码成json字符串代码如下:
movie := Movie{"新剧之王", 2000, 199, []string{"xingye", "yjy"}}
//编码的过程 结构体------>json
jsonStr, err := json.Marshal(movie)
if err != nil {
fmt.Println("json marshal error", err)
return
}
fmt.Printf("jsonStr=%s\n", jsonStr)
fmt.Println(err) //<nil>
要注意:
- 可导出的成员属性的首字母是大写的,才可以转成 json 。
- 如果属性有 json 标签,那么转化成的 json key 就用该标签里的值,否则取属性名来作为 key
- bool类型也是可以直接转换为json的value值。循环的数据结构(导致marshal陷入死循环)、Channel, complex 以及函数不能被编码json字符串。
- json 编译之后就是字符串。
- 切片在编码时自动转换为它所指向的值。
那就再来看一下解码的过程吧。通过使用 json.Unmarshal()方法将json字符串解码到相应的数据结构。代码如下:
//解码的过程 jsonstr------->结果体
//jsonStr={"title":"新剧之王","year":2000,"rmb":199,"actors":["xingye","yjy"]}
//首先定义一个结构体
myMovie := Movie{}
json.Unmarshal(jsonStr, &myMovie)
if err != nil {
fmt.Println("json marshal error", err)
return
}
fmt.Printf("%v\n", myMovie)//{新剧之王 2000 199 [xingye yjy]}
要注意:
- json字符串解析时,需要一个“接收体”接受解析后的数据,且Unmarshal时接收体必须传递指针。否则解析虽不报错,但数据无法赋值到接受体(Movie{})中。
- 解析时,接收体可自行定义。
完整代码如下:
package main
import (
"encoding/json"
"fmt"
)
type Movie struct {
Title string `json:"title"` //想换成json
Year int `json:"year"`
Price int `json:"rmb"`
Actors []string `json:"actors"` //演员切片
}
func main() {
movie := Movie{"新剧之王", 2000, 199, []string{"xingye", "yjy"}}
//编码的过程 结构体------>json
jsonStr, err := json.Marshal(movie)
if err != nil {
fmt.Println("json marshal error", err)
return
}
fmt.Printf("jsonStr=%s\n", jsonStr)
fmt.Println(err) //<nil>
//解码的过程 jsonstr------->结果体
//jsonStr={"title":"新剧之王","year":2000,"rmb":199,"actors":["xingye","yjy"]}
//首先定义一个结构体
myMovie := Movie{}
json.Unmarshal(jsonStr, &myMovie)
if err != nil {
fmt.Println("json marshal error", err)
return
}
fmt.Printf("%v\n", myMovie)//{新剧之王 2000 199 [xingye yjy]}
}