JSON反序列化后嵌套结构体数组丢失问题求助
解决Go中JSON反序列化嵌套结构体数组丢失的问题
我一眼就看到了几个导致你嵌套数组反序列化后丢失的关键点,咱们一个个来修正:
1. JSON字符串的语法错误
你的JSON里"shared_items:"多了个多余的冒号,这会导致Go的JSON解析器找不到对应的字段,直接跳过这个键值对。修正后的JSON应该是:
const myStr = `{ "name": "test_session1", "shared_items": [ { "id": 0, "name": ".aspnet" }, { "id": 1, "name": ".bash_profile" } ] }`
2. 结构体定义的核心问题
你的Session结构体有两个明显疏漏:
Name字段的JSON标签写成了json:"...",这完全不对,应该对应JSON里的name键,即json:"name"- 根本没有定义对应
shared_items的字段!这是最关键的问题——你都没告诉Go要把JSON里的数组映射到哪个结构体字段,自然反序列化后就丢失了
另外SharedItem结构体也要确保JSON标签和JSON键完全对应。修正后的结构体定义如下:
type SharedItem struct { ID uint64 `json:"id"` Name string `json:"name"` } type Session struct { ID uint64 `json:"id,omitempty"` // 原JSON里没有id字段,加omitempty避免序列化时输出空值 Name string `json:"name"` SharedItems []SharedItem `json:"shared_items"` // 新增字段对应JSON里的嵌套数组 }
3. 完整的反序列化示例代码
把这些修正点整合起来,完整的可运行代码如下:
package main import ( "encoding/json" "fmt" ) type SharedItem struct { ID uint64 `json:"id"` Name string `json:"name"` } type Session struct { ID uint64 `json:"id,omitempty"` Name string `json:"name"` SharedItems []SharedItem `json:"shared_items"` } func main() { const myStr = `{ "name": "test_session1", "shared_items": [ { "id": 0, "name": ".aspnet" }, { "id": 1, "name": ".bash_profile" } ] }` var session Session err := json.Unmarshal([]byte(myStr), &session) if err != nil { fmt.Println("反序列化失败:", err) return } fmt.Printf("反序列化结果:\n%+v\n", session) }
运行这段代码后,你就能看到SharedItems数组被正确解析出来,输出大概是:
反序列化结果: {ID:0 Name:test_session1 SharedItems:[{ID:0 Name:.aspnet} {ID:1 Name:.bash_profile}]}
总结一下,这类问题大多是JSON语法错误或者结构体字段与JSON键的映射不匹配导致的,下次遇到可以先优先检查这两点哦~
内容的提问来源于stack exchange,提问作者TonyW
相关产品推荐
相关产品推荐

