Go语言解析嵌套JSON:如何修改结构体实现正确解析
解决Go语言解析嵌套JSON的问题
首先,你的代码有两个关键问题导致解析失败:
- 结构体的
id字段是小写开头,Go的json包无法访问未导出的字段(只有大写开头的字段才会被序列化/反序列化)。 Lists字段定义为[]string,但JSON中lists是对象数组,不是字符串数组,类型完全不匹配。
修改后的结构体定义
我们需要先定义一个子结构体来对应lists数组中的每个对象,再将Lists字段改为这个子结构体的切片,同时修正字段的导出权限:
// 定义lists数组中的元素结构体 type ListItem struct { EmployeeID string `json:"empoyee_id,omitempty"` // 注意你JSON里的拼写是empoyee_id(少了一个l),如果是笔误可以改成employee_id ContractorID string `json:"contractor_id,omitempty"` Name string `json:"name"` } // 主结构体 type Result struct { ID int64 `json:"id"` // 改为大写开头,让json包能访问 Date string `json:"date"` Lists []ListItem `json:"lists"` // 改为ListItem切片,对应JSON中的对象数组 }
为什么这样修改?
- 字段导出:Go语言中,只有大写开头的结构体字段是导出的,
json.Unmarshal只能处理导出字段,所以必须把id改成ID。 - 匹配JSON结构:JSON里的
lists是包含多个对象的数组,每个对象有name和要么empoyee_id要么contractor_id,所以我们用ListItem结构体来描述这些对象,再用[]ListItem作为Lists的类型,完美匹配JSON的嵌套结构。
完整解析示例
package main import ( "encoding/json" "fmt" ) type ListItem struct { EmployeeID string `json:"empoyee_id,omitempty"` ContractorID string `json:"contractor_id,omitempty"` Name string `json:"name"` } type Result struct { ID int64 `json:"id"` Date string `json:"date"` Lists []ListItem `json:"lists"` } func main() { contents := []byte(`{ "id" : 12345656, "date" : "2018-05-02-18-16-17", "lists" : [ { "empoyee_id": "12343", "name": "User1" }, { "contractor_id" : "12343", "name": "User1" }, { "contractor_id" : "12343", "name": "User1" } ] }`) var result Result err := json.Unmarshal(contents, &result) if err != nil { fmt.Println("解析错误:", err) return } fmt.Printf("解析结果: %+v\n", result) }
运行这段代码就能正确解析你的嵌套JSON了,每个ListItem会根据JSON中的字段填充对应的EmployeeID或ContractorID,另一个因为加了omitempty标签会被忽略。
内容的提问来源于stack exchange,提问作者jsor
相关产品推荐
相关产品推荐

