在日常开发中,处理JSON几乎是每个程序员绕不开的任务。尤其是在写后端接口、解析配置文件或和前端交互时,JSON无处不在。Go语言因为语法简洁、性能出色,成了不少开发者处理JSON的首选工具。
结构体与JSON的自动映射
Go通过encoding/json包提供了开箱即用的JSON支持。最常用的场景就是把JSON字符串转成结构体,或者反过来。比如你收到一段用户信息:
{"name": "小明", "age": 25, "email": "xiaoming@example.com"}
可以直接定义一个结构体来接收:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email"`
}
func main() {
data := `{"name": "小明", "age": 25, "email": "xiaoming@example.com"}`
var user User
json.Unmarshal([]byte(data), &user)
fmt.Printf("%+v\n", user)
}
这里的json:"xxx"是结构体标签,告诉Go字段对应JSON里的哪个键。反向操作也很简单,用json.Marshal就能把结构体转回JSON字符串。
处理不确定结构的JSON
有时候你拿到的JSON结构不固定,比如API返回的数据可能有多种格式。这时候可以用map[string]interface{}来接:
var result map[string]interface{}
json.Unmarshal([]byte(data), &result)
fmt.Println(result["name"])
虽然灵活,但取值时要小心类型断言,不然容易panic。比如result["age"]其实是float64,因为JSON没有整型概念,数字默认按浮点处理。
嵌套结构和切片处理
真实项目里,JSON往往更复杂。比如一个订单包含多个商品:
{
"order_id": "1001",
"items": [
{"name": "键盘", "price": 299},
{"name": "鼠标", "price": 99}
]
}
对应的结构体可以这样写:
type Order struct {
OrderID string `json:"order_id"`
Items []struct {
Name string `json:"name"`
Price int `json:"price"`
} `json:"items"`
}
解析之后就能直接遍历Items,方便又直观。
忽略空字段和隐私字段
有时候不想把某些字段输出到JSON里,比如用户密码。可以在标签里加-,omitempty:
Password string `json:"-"`
Phone string `json:"phone,omitempty"`
带omitempty的字段如果为空,序列化时就会被跳过,生成更干净的输出。
Go处理JSON并不难,关键是熟悉结构体标签和常用方法。用熟了你会发现,比起手动拼字符串或层层判断类型,这种方式既安全又高效。