Go语言中Unmarshal JSON后Movies结构体Actors字段为空的原因
JSON反序列化后Movies.Actors为空数组的原因及解决办法
问题场景
定义的Go结构体:
type Movies struct { ID string Title string Actors []struct { Name string City string State string Country string } }
编写的SQL查询及逻辑:
query := `select m.id as id, m.title as title, m.actors as actors from Movies where id = $1` rows, err := db.Query(query, movieID) var rowsOut []types.Movies for rows.Next() { var movies types.Movies var actors_json string scanerr := rows.Scan( &movies.id, &movies.title, &actors_json ) }
打印actors_json时输出与数据库存储一致:
{"actors": [{"name": "x", "city": "Miami", "state": "FL", "country": "US"}]}
但执行json.Unmarshal([]byte(actors_json), &movies)后,movies.Actors显示为空数组[]。
原因分析
- 字段名大小写与JSON键不匹配:Go结构体的
Actors字段首字母大写,但JSON字符串里对应的键是全小写的"actors",默认情况下JSON反序列化严格区分大小写,无法自动完成映射。 - 反序列化目标结构不匹配:
actors_json的顶层结构是包含actors键的对象,直接反序列化到Movies实例时,因缺少对应JSON标签,JSON中的actors键无法关联到结构体的Actors字段。
解决办法
方法一:给结构体添加JSON标签,直接反序列化
修改结构体,为每个字段添加匹配JSON键的标签:
type Movies struct { ID string `json:"id"` Title string `json:"title"` Actors []struct { Name string `json:"name"` City string `json:"city"` State string `json:"state"` Country string `json:"country"` } `json:"actors"` }
此时执行json.Unmarshal([]byte(actors_json), &movies),JSON中的actors键就能正确映射到Movies.Actors字段。
方法二:用临时结构体单独解析Actors数组
若不想修改原结构体,可定义临时结构体承接JSON内容:
// 临时结构体,仅用于解析actors字段 type actorsWrapper struct { Actors []struct { Name string `json:"name"` City string `json:"city"` State string `json:"state"` Country string `json:"country"` } `json:"actors"` }
替换反序列化逻辑:
var wrapper actorsWrapper err := json.Unmarshal([]byte(actors_json), &wrapper) if err != nil { // 处理反序列化错误 } // 将解析后的actors赋值给movies.Actors movies.Actors = wrapper.Actors
内容的提问来源于stack exchange,提问作者gianluca
相关产品推荐
相关产品推荐

