概述
encoding/json
蕴含了 JSON 相干解决办法。
例子
构造体转为 JSON 字符串
调用 json.Marshal()
办法实现。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
addr string `json:"addr"` // 该属性转 JSON 时会被疏忽
}
func main() {
tom := person{ // 应用字面量初始化
Name: "Tom",
Age: 6,
addr: "???",
}
tomJson, err := json.Marshal(tom)
if err != nil {panic(err)
}
fmt.Printf("json.Marshal(tom) = %s\n", tomJson) // 从输入字符串中能够看到,并没有 addr 属性
}
// $ go run main.go
// 输入如下
/**
json.Marshal(tom) = {"name":"Tom","age":6}
*/
JSON 字符串转为构造体
调用 json.Unmarshal()
办法实现。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
addr string `json:"addr"` // 该属性转 json 时会被疏忽
}
func main() {
// 留神: JSON 字符串格局肯定要正确,否则会报错
tomJson := `
{
"name": "Tom",
"age": 6,
"addr": "???"
}
`
var tom person
err := json.Unmarshal([]byte(tomJson), &tom)
if err != nil {panic(err)
}
// 从输入字符串中能够看到,并没有为 addr 属性赋值
fmt.Printf("Tom's name is %s, age is %d, addr is %s\n", tom.Name, tom.Age, tom.addr)
}
// $ go run main.go
// 输入如下
/**
Tom's name is Tom, age is 6, addr is
*/
输入格式化 JSON 字符串
调用 json.MarshalIndent()
办法实现。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobby []string `json:"hobby"`}
func main() {
tom := person{ // 应用字面量初始化
Name: "Tom",
Age: 6,
Hobby: []string{
"reading",
"coding",
"movie",
},
}
// 前缀符为空字符串,缩进符为两个空格
formatted, err := json.MarshalIndent(tom, ""," ")
if err != nil {panic(err)
}
fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)
}
// $ go run main.go
// 输入如下
/**
json.MarshalIndent(tom) =
{
"name": "Tom",
"age": 6,
"hobby": [
"reading",
"coding",
"movie"
]
}
*/
疏忽零值
通过 omitempty
关键字实现。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobby []string `json:"hobby,omitempty"` // omitempty 关键字将字段标记为疏忽零值}
func main() {
tom := person{ // 应用字面量初始化
Name: "Tom",
Age: 6,
}
// 前缀符为空字符串,缩进符为两个空格
formatted, err := json.MarshalIndent(tom, ""," ")
if err != nil {panic(err)
}
fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)
}
// $ go run main.go
// 输入如下
/**
json.MarshalIndent(tom) =
{
"name": "Tom",
"age": 6
}
*/
保留零值
某些场景下,须要在输入 JSON 字符串时主动疏忽零值,然而在将 JSON 字符串转为指标构造体时,须要保留零值。
能够通过将字段设置为 指针 类型即可。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
HasMoney *bool `json:"hasMoney,omitempty"`
}
func main() {
tomJson := `
{
"name": "Tom",
"age": 6,
"hasMoney": false
}
`
var tom person
err := json.Unmarshal([]byte(tomJson), &tom)
if err != nil {panic(err)
}
fmt.Printf("Tom's name is %s, age is %d, hasMoney is %t\n", tom.Name, tom.Age, *tom.HasMoney)
}
// $ go run main.go
// 输入如下
/**
Tom's name is Tom, age is 6, hasMoney is false
*/
疏忽公开值
某些场景下,须要将构造体字段设置为公开可导出,然而又不心愿 JSON 序列化时输入该字段,
能够应用 -
符号标识。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobby []string `json:"-"`}
func main() {
tom := person{ // 应用字面量初始化
Name: "Tom",
Age: 6,
Hobby: []string{
"reading",
"coding",
"movie",
},
}
// 前缀符为空字符串,缩进符为两个空格
formatted, err := json.MarshalIndent(tom, ""," ")
if err != nil {panic(err)
}
fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)
}
// $ go run main.go
// 输入如下
/**
json.MarshalIndent(tom) =
{
"name": "Tom",
"age": 6
}
*/