You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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显示为空数组[]。

原因分析

  1. 字段名大小写与JSON键不匹配:Go结构体的Actors字段首字母大写,但JSON字符串里对应的键是全小写的"actors",默认情况下JSON反序列化严格区分大小写,无法自动完成映射。
  2. 反序列化目标结构不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:47:05