Google Pub/Sub无法接收嵌套字段问题求助
问题根源与解决方案
核心原因
你的问题出在结构体字段定义方式和Go语言JSON序列化的规则上:
- 匿名字段导致结构平级展开:你在
Payload中使用了Image和Thumbnail作为匿名字段,Go的json.Marshal会将嵌套结构体的字段直接平级到父结构体的JSON中,而非保留嵌套对象结构。同时如果两个嵌套结构体有同名字段(比如URL、Width),后序列化的字段会覆盖前者。 - 字段导出问题:如果你实际代码中
Image/Thumbnail的字段是小写开头(非导出字段),json包会直接忽略这些字段,导致序列化后的JSON完全缺失嵌套字段内容。
另外你期望的是嵌套JSON结构,但当前匿名字段的写法无法实现这一需求。
解决方案
修改发送端和接收端的结构体定义,使用命名嵌套字段,同时确保所有需要序列化的字段都是大写开头(导出字段):
修改后的结构体代码
type Payload struct { ID string `json:"ID"` Type string `json:"Type"` Name string `json:"Name"` Image Image `json:"Image"` // 命名字段,保留嵌套结构 Thumbnail Thumbnail `json:"Thumbnail"` // 命名字段,保留嵌套结构 } type Image struct { URL string `json:"URL"` Width string `json:"Width"` Height string `json:"Height"` } type Thumbnail struct { URL string `json:"URL"` Width string `json:"Width"` Height string `json:"Height"` }
效果验证
修改后,序列化后的JSON会变成你期望的嵌套结构:
{"ID":"1","Type":"image","Name":"Image 1","Image":{"URL":"https://example.com/image1","Width":"100","Height":"100"},"Thumbnail":{"URL":"https://example.com/image1/thumb","Width":"50","Height":"50"}}
接收器反序列化后就能正确获取所有嵌套字段内容。
内容的提问来源于stack exchange,提问作者Атанас Чолаков
相关产品推荐
相关产品推荐

