非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第11章 文件操作
- 11.3 处理JSON文件
- 11.3.2 解码JSON
- 11.4 小结
第11章 文件操作
11.3 处理JSON文件
11.3.2 解码JSON
解码JSON会使用到Unmarshal接口,也就是Marshal的反操作。
func Unmarshal(data []byte, v interface{}) error
Unmarshal函数解析JSON编码的数据并将结果存入v指向的值。
要将JSON数据解码写入一个接口类型值,函数会将数据解码为如下类型写入接口:
Bool 对应JSON布尔类型
float64 对应JSON数字类型
string 对应JSON字符串类型
[]interface{} 对应JSON数组
map[string]interface{} 对应JSON对象
nil 对应JSON的null
如果一个JSON值不匹配给出的目标类型,或者一个JSON数字写入目标类型时溢出,Unmarshal函数会跳过该字段并尽量完成其余的解码操作。我们首先来看使用map解码JSON。
[ 动手写11.3.3]
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{
"name":"小丁",
"age":23,
"sex":true,
"birthday":"2022-12-05",
"company":"字节跳动",
"language":[
"Go",
"Java",
"Python"
]
}
`
// 创建一个map
m := make(map[string]interface{}, 6)
err := json.Unmarshal([]byte(jsonStr), &m)
if err != nil {
fmt.Println(err)
}
fmt.Println("m = ", m)
// 类型断言
for key, value := range m {
switch data := value.(type) {
case string:
fmt.Printf("map[%s] 的值类型为string, value = %s\n", key, data)
case float64:
fmt.Printf("map[%s] 的值类型为int, value = %f\n", key, data)
case bool:
fmt.Printf("map[%s] 的值类型为bool, value = %t\n", key, data)
case []string:
fmt.Printf("map[%s] 的值类型为[]string, value = %v\n", key, data)
case []interface{}:
fmt.Printf("map[%s] 的值类型为[]interface{}, value = %v\n", key, data)
}
}
}
运行结果
使用map来解码JSON时,需要使用Go的类型断言【这个 后面在学 接口的时候还会详细的说】。
可见,使用map解码JSON需要对其类型进行判断,非常烦琐。我们再来看看使用struct来解码JSON,JSON库会自动对结构体的类型进行解析,无须类型判断。
[ 动手写 11.3.4]
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Sex bool `json:"sex"`
Birthday string `json:"birthday"`
Company string `json:"company"`
Language []string `json:"language"`
}
func main() {
jsonStr := `{
"name":"小丁",
"age":23,
"sex":true,
"birthday":"2022-12-05",
"company":"字节跳动",
"language":[
"Go",
"Java",
"Python"
]
}
`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println(err)
}
fmt.Printf("person = %+v", person)
}
运行结果
【提示】
当我们需要对大量的JSON进行快速解析处理时,标准库提供的JSON处理库“encoding/json”可能就不能满足我们的需求,GitHub开源了一个比标准库解析速度快10倍的fastjson库(https://github.com/valyala/fastjson)。
11.4 小结
- 对目录的新建、查看和删除。
- 对文件的新建、查看和删除。
- 如何进行JSON编码与解码。