面试题答案
一键面试解决结构体字段名称首字母大写导致JSON序列化后键名不一致的问题
在Go语言中,结构体字段如果首字母大写才会在包外可见,而JSON序列化默认使用结构体字段名作为键名。可以通过结构体标签(struct tag)来指定JSON序列化后的键名。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{
Name: "John",
Age: 30,
}
data, err := json.Marshal(p)
if err != nil {
fmt.Println("Marshal error:", err)
return
}
fmt.Println(string(data))
}
在上述代码中,Person
结构体的Name
和Age
字段使用结构体标签json:"name"
和json:"age"
,这样在JSON序列化时,键名会是name
和age
,而不是Name
和Age
。
处理嵌套结构体的JSON反序列化
假设有如下嵌套结构体:
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
City string `json:"city"`
State string `json:"state"`
}
type Employee struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"`
}
func main() {
jsonData := `{
"name": "Alice",
"age": 25,
"address": {
"city": "New York",
"state": "NY"
}
}`
var emp Employee
err := json.Unmarshal([]byte(jsonData), &emp)
if err != nil {
fmt.Println("Unmarshal error:", err)
return
}
fmt.Printf("Name: %s, Age: %d, City: %s, State: %s\n", emp.Name, emp.Age, emp.Address.City, emp.Address.State)
}
在上述代码中,Employee
结构体包含一个嵌套的Address
结构体。在反序列化时,只要JSON数据的结构与结构体定义匹配,Go语言的json.Unmarshal
函数就能正确地将JSON数据填充到嵌套结构体中。注意,嵌套结构体的字段同样要遵循首字母大写(或使用结构体标签)的规则才能正确反序列化。