面试题答案
一键面试package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 序列化
user := User{Name: "John", Age: 30}
data, err := json.Marshal(user)
if err != nil {
fmt.Println("序列化错误:", err)
return
}
fmt.Println("序列化后的JSON字符串:", string(data))
// 反序列化
jsonStr := `{"name":"Jane","age":25}`
var newUser User
err = json.Unmarshal([]byte(jsonStr), &newUser)
if err != nil {
fmt.Println("反序列化错误:", err)
return
}
fmt.Println("反序列化后的User结构体:", newUser)
}
结构体标签 json:"name"
和 json:"age"
的作用:
- 在序列化时,
encoding/json
包会使用这些标签来指定结构体字段在生成的 JSON 字符串中的字段名。例如json:"name"
会使得Name
字段在 JSON 中以"name"
作为键。 - 在反序列化时,
encoding/json
包会根据这些标签来匹配 JSON 中的字段名到结构体的相应字段。例如"name"
会匹配到Name
字段。如果没有这些标签,默认会使用结构体字段的大写字母开头的名字作为 JSON 中的键,但这种方式可能不符合 JSON 命名习惯(通常 JSON 中字段名使用小写字母开头),使用标签可以更好地控制 JSON 序列化和反序列化的行为。