Go基础:json文件处理详解(标准库`encoding/json`)
文章目录
- 一、JSON序列化与反序列化
- 1.1 序列化(将Go结构体转换为JSON)
- 1.2 反序列化(将JSON转换为Go结构体)
- 二、JSON文件读写
- 2.1 写入JSON文件
- 2.2 读取JSON文件
- 三、JSON处理中的常见技巧
- 3.1 处理嵌套JSON
- 3.2 忽略空字段
一、JSON序列化与反序列化
Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json
实现。
1.1 序列化(将Go结构体转换为JSON)
使用json.Marshal
函数可以将Go结构体转换为JSON格式的字节切片。
示例代码:
package main
import ("encoding/json""fmt"
)
type Person struct {Name string `json:"name"`Age int `json:"age"`
}
func main() {person := Person{Name: "Alice", Age: 30}jsonData, err := json.Marshal(person)if err != nil {fmt.Println("Error marshaling JSON:", err)return}fmt.Println(string(jsonData))
}
输出:
{"name":"Alice","age":30}
1.2 反序列化(将JSON转换为Go结构体)
使用json.Unmarshal
函数可以将JSON数据解析为Go结构体。
示例代码:
package main
import ("encoding/json""fmt"
)
type Person struct {Name string `json:"name"`Age int `json:"age"`
}
func main() {jsonData := `{"name":"Bob","age":25}`var person Personerr := json.Unmarshal([]byte(jsonData), &person)if err != nil {fmt.Println("Error unmarshaling JSON:", err)return}fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}
输出:
Name: Bob, Age: 25
二、JSON文件读写
2.1 写入JSON文件
使用os.Create
和json.Marshal
结合,可以将Go结构体数据写入JSON文件。
示例代码:
package main
import ("encoding/json""os"
)
type Person struct {Name string `json:"name"`Age int `json:"age"`
}
func main() {person := Person{Name: "Charlie", Age: 28}file, err := os.Create("person.json")if err != nil {panic(err)}defer file.Close()encoder := json.NewEncoder(file)err = encoder.Encode(person)if err != nil {panic(err)}
}
运行后,person.json
文件内容为:
{"name":"Charlie","age":28}
2.2 读取JSON文件
使用os.Open
和json.Decoder
结合,可以从JSON文件中读取数据并解析为Go结构体。
示例代码:
package main
import ("encoding/json""fmt""os"
)
type Person struct {Name string `json:"name"`Age int `json:"age"`
}
func main() {file, err := os.Open("person.json")if err != nil {panic(err)}defer file.Close()var person Persondecoder := json.NewDecoder(file)err = decoder.Decode(&person)if err != nil {panic(err)}fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}
输出:
Name: Charlie, Age: 28
三、JSON处理中的常见技巧
3.1 处理嵌套JSON
Go语言支持嵌套结构体,可以轻松处理复杂的JSON数据。
示例代码:
package main
import ("encoding/json""fmt"
)
type Address struct {City string `json:"city"`State string `json:"state"`
}
type Person struct {Name string `json:"name"`Age int `json:"age"`Address Address `json:"address"`
}
func main() {jsonData := `{"name":"David","age":40,"address":{"city":"New York","state":"NY"}}`var person Personerr := json.Unmarshal([]byte(jsonData), &person)if err != nil {fmt.Println("Error unmarshaling JSON:", err)return}fmt.Printf("Name: %s, City: %s\n", person.Name, person.Address.City)
}
输出:
Name: David, City: New York
3.2 忽略空字段
通过omitempty
标签,可以在序列化时忽略空字段。
示例代码:
package main
import ("encoding/json""fmt"
)
type Person struct {Name string `json:"name"`Age int `json:"age,omitempty"`
}
func main() {person := Person{Name: "Eve"}jsonData, err := json.Marshal(person)if err != nil {fmt.Println("Error marshaling JSON:", err)return}fmt.Println(string(jsonData))
}
输出:
{"name":"Eve"}
Go语言通过encoding/json
包提供了强大的JSON处理能力,包括序列化、反序列化、文件读写及复杂数据结构的处理。