Go语言之json使用
Go 语言中,官方提供了一个专门的包 encoding/json
json 反序列(解析)
假设有这样一个 json 数据,我要将其解析为 go 结构体
{ "name": "kuizuo", "age": 20 }
首先需要定义结构体,通常可以使用 json 转 go 结构体的在线工具,如下图

其转化代码如下
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
var p Person
jsonString := `{"name": "kuizuo", "age" : 20}`
err := json.Unmarshal([]byte(jsonString), &p)
if err == nil {
fmt.Println(p.Name)
fmt.Println(p.Age)
} else {
fmt.Println(err)
}
}
主要步骤
- 定义结构体(一般结构体的每个字段第一个字母大写),并新建结构体变量
- 核心代码
err := json.Unmarshal([]byte(jsonString), &p),如果解析有效那么 err 为 nil,并将 p 赋值其 json 数据。 - 访问结构体 p 的成员
解析 json 数组
如果要解析 json 数组,其步骤同上,演示代码如下
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
var persons []Person
jsonString := `[{"name": "kuizuo", "age" : 20},{"name": "愧怍", "age" : 22}]`
err := json.Unmarshal([]byte(jsonString), &persons)
if err == nil {
for _, p := range persons {
fmt.Print("\t\n", p.Name)
fmt.Print("\t", p.Age)
}
} else {
fmt.Println(err)
}
}
哪怕对于再复杂的 json 数据,都要先将 json 转为 go 结构体,然后执行json.Unmarshal。
自定义属性名称的映射
假设 json 的 key 值存在空格(一般情况下不可能,以我多年读写 json 的经历都没看到过),由于 go 中无法将空格做为变量标识符(貌似没有语言支持空格当标 识符),而 json-to-go 工具会将空格清楚,并将下个单词首字母大写。
{
"user name": "kuizuo"
}
type AutoGenerated struct {
UserName string `json:"user name"`
}
当然,这里的 UserName 可以随便命名 go 变量规范的名字,只要json:"user name"不变,结构体映射的还是user name属性。