在Golang中,处理JSON数据通常涉及到标准库encoding/json
。以下是一些处理JSON数据的常见操作:
- 将Go的结构体编码为JSON:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{"Alice", 30}
jsonData, err := json.Marshal(person)
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", jsonData)
}
- 解码JSON到Go的结构体:
func main() {
var person Person
jsonData := `{"name":"Alice","age":30}`
err := json.Unmarshal([]byte(jsonData), &person)
if err != nil {
log.Fatalf("JSON unmarshaling failed: %s", err)
}
fmt.Printf("%+v\n", person)
}
- 使用
json.Decoder
和json.Encoder
进行更高效的流式处理:
func main() {
enc := json.NewEncoder(os.Stdout)
dec := json.NewDecoder(os.Stdin)
// 编码
if err := enc.Encode(person); err != nil {
log.Fatal(err)
}
// 解码
var p Person
if err := dec.Decode(&p); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", p)
}
- 处理JSON数组或其他复杂数据结构:
type People []Person
func main() {
people := People{{"Alice", 30}, {"Bob", 25}}
jsonData, err := json.Marshal(people)
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", jsonData)
}
- 处理JSON中的字段省略(omitempty)标签:
type Person struct {
Name string `json:"name"`
Age int `json:"age,omitempty"` // 如果Age为0,则在JSON中省略Age字段
}
- 处理JSON中的字段忽略(-)标签:
type Person struct {
Name string `json:"name"`
Age int `json:"-"` // 忽略Age字段,不会出现在JSON中
}
- 使用
json.Number
处理大数整数:
type Tweet struct {
Id json.Number `json:"id"`
// ...
}
- 使用
map[string]interface{}
处理动态JSON结构:
var result map[string]interface{}
err := json.Unmarshal(data, &result)
if err != nil {
log.Fatalf("JSON unmarshaling failed: %s", err)
}
这些是处理JSON的基本操作,在实际应用中可以根据需要进行相应的扩展和定制。