文章目录
-
- 一、JSON序列化与反序列化
-
- [1.1 序列化(将Go结构体转换为JSON)](#1.1 序列化(将Go结构体转换为JSON))
- [1.2 反序列化(将JSON转换为Go结构体)](#1.2 反序列化(将JSON转换为Go结构体))
- 二、JSON文件读写
-
- [2.1 写入JSON文件](#2.1 写入JSON文件)
- [2.2 读取JSON文件](#2.2 读取JSON文件)
- 三、JSON处理中的常见技巧
-
- [3.1 处理嵌套JSON](#3.1 处理嵌套JSON)
- [3.2 忽略空字段](#3.2 忽略空字段)
一、JSON序列化与反序列化
Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json
实现。
1.1 序列化(将Go结构体转换为JSON)
使用json.Marshal
函数可以将Go结构体转换为JSON格式的字节切片。
示例代码:
go
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))
}
输出:
json
{"name":"Alice","age":30}
1.2 反序列化(将JSON转换为Go结构体)
使用json.Unmarshal
函数可以将JSON数据解析为Go结构体。
示例代码:
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 Person
err := 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文件。
示例代码:
go
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
文件内容为:
json
{"name":"Charlie","age":28}
2.2 读取JSON文件
使用os.Open
和json.Decoder
结合,可以从JSON文件中读取数据并解析为Go结构体。
示例代码:
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 Person
decoder := 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数据。
示例代码:
go
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 Person
err := 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
标签,可以在序列化时忽略空字段。
示例代码:
go
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))
}
输出:
json
{"name":"Eve"}
Go语言通过encoding/json
包提供了强大的JSON处理能力,包括序列化、反序列化、文件读写及复杂数据结构的处理。