golang 解析json
简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。在前后端分离的开发模式中,常常需要通过json格式进行数据传输。而在Golang中,解析json数据非常简单。本文将详细介绍在Golang中如何解析json。
JSON基本结构
JSON数据由key-value对组成,使用大括号{}包裹。可以使用逗号分隔不同的key-value对。key是一个字符串,使用双引号包裹;value可以是字符串、数字、布尔值、对象或者数组。
例如,下面是一个简单的JSON数据:
{
"name": "Alice",
"age": 25,
"married": false,
"address": {
"city": "Beijing",
"country": "China"
},
"hobbies": ["reading", "traveling"]
}
Golang中的Json解析
Golang中有一个标准库encoding/json
用于处理json数据。可以使用它提供的函数来解析和生成json数据。
解析Json到结构体
首先我们需要定义一个结构体来存储Json数据。结构体的字段名需要和Json数据的key对应。
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
Address Address `json:"address"`
Hobbies []string `json:"hobbies"`
}
type Address struct {
City string `json:"city"`
Country string `json:"country"`
}
然后,我们可以使用json.Unmarshal()
函数将Json数据解析到结构体中。
jsonStr := `{
"name": "Alice",
"age": 25,
"married": false,
"address": {
"city": "Beijing",
"country": "China"
},
"hobbies": ["reading", "traveling"]
}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println("解析json失败:", err)
} else {
fmt.Println("解析json成功!")
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Married:", person.Married)
fmt.Println("Address:", person.Address.City, person.Address.Country)
fmt.Println("Hobbies:", person.Hobbies)
}
运行结果:
解析json成功!
Name: Alice
Age: 25
Married: false
Address: Beijing China
Hobbies: [reading traveling]
解析Json到接口变量
如果我们不知道Json数据的结构,可以将其解析到一个空接口变量中。
jsonStr := `{
"name": "Alice",
"age": 25,
"married": false,
"address": {
"city": "Beijing",
"country": "China"
},
"hobbies": ["reading", "traveling"]
}`
var obj interface{}
err := json.Unmarshal([]byte(jsonStr), &obj)
if err != nil {
fmt.Println("解析json失败:", err)
} else {
fmt.Println("解析json成功!")
fmt.Println(obj)
}
运行结果:
解析json成功!
map[name:Alice age:25 married:false address:map[city:Beijing country:China] hobbies:[reading traveling]]
解析Json数组
有时候,Json数据是一个数组格式。我们可以使用切片(slice)来存储Json数组。
jsonStr := `[
{
"name": "Alice",
"age": 25,
"married": false
},
{
"name": "Bob",
"age": 30,
"married": true
}
]`
var persons []Person
err := json.Unmarshal([]byte(jsonStr), &persons)
if err != nil {
fmt.Println("解析json失败:", err)
} else {
fmt.Println("解析json成功!")
for _, p := range persons {
fmt.Println("Name:", p.Name)
fmt.Println("Age:", p.Age)
fmt.Println("Married:", p.Married)
}
}
运行结果:
解析json成功!
Name: Alice
Age: 25
Married: false
Name: Bob
Age: 30
Married: true
Json操作的注意事项
字段的Tag
在解析Json数据时,我们可以使用字段的Tag来指定Json数据中的key。字段的Tag是一个字符串,被反引号包裹,写在字段定义的后面。
例如,在上面的示例中,我们为结构体字段添加了Tag:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
Address Address `json:"address"`
Hobbies []string `json:"hobbies"`
}
字段的默认值
当解析Json数据时,如果字段在Json数据中不存在或者类型不匹配,则会使用字段的默认值。
例如,下面的Json数据中没有address
字段:
jsonStr := `{
"name": "Alice",
"age": 25,
"married": false,
"hobbies": ["reading", "traveling"]
}`
我们可以为字段设置默认值,当Json数据中没有这个字段时,将使用默认值:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
Address Address `json:"address"`
Hobbies []string `json:"hobbies"`
}
type Address struct {
City string `json:"city"`
Country string `json:"country"`
}
var person Person
person.Address = Address{City: "Unknown", Country: "Unknown"} // 设置默认值
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println("解析json失败:", err)
} else {
fmt.Println("解析json成功!")
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Married:", person.Married)
fmt.Println("Address:", person.Address.City, person.Address.Country)
fmt.Println("Hobbies:", person.Hobbies)
}
运行结果:
解析json成功!
Name: Alice
Age: 25
Married: false
Address: Unknown Unknown
Hobbies: [reading traveling]
结论
本文介绍了在Golang中如何解析Json数据。通过使用encoding/json
包提供的函数,我们可以将Json数据解析到结构体中,或者解析到一个空接口变量中。同时,我们还可以设置字段的Tag和默认值来处理一些特殊情况。