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

Go如何将API响应内容反序列化为带map[string]int字段的ActUser结构体

问题根因

你拿到的字节数组转成明文JSON后结构如下:

["{\"NoOfViews\":{\"0\":0},\"NoOfLikes\":{\"0\":0},\"NoOfComments\":{\"0\":0},\"NoOfShares\":{\"0\":0}}","{}"]

这是一个字符串数组,数组内的每个元素都是转义后的JSON格式字符串,不是直接的JSON对象,所以直接反序列化到[]ActUser类型就会抛出「无法把字符串反序列化为ActUser类型」的错误。

解决方法

分两步处理即可完成反序列化:

  1. 先把原始字节反序列化为字符串数组
  2. 遍历字符串数组,逐个将每个JSON字符串反序列化为ActUser结构体

基础实现代码

// 第一步:先反序列化到字符串切片
var strSlice []string
err = json.Unmarshal(bodyBytes, &strSlice)
if err != nil {
    // 自定义错误处理逻辑
    panic(err)
}

// 第二步:逐个反序列化每个字符串为ActUser
result := make([]ActUser, 0, len(strSlice))
for _, s := range strSlice {
    var user ActUser
    err = json.Unmarshal([]byte(s), &user)
    if err != nil {
        // 可根据需求选择跳过错误条目或者终止流程
        panic(err)
    }
    result = append(result, user)
}

优化方案:自定义反序列化方法

如果需要复用逻辑,可以为切片类型实现自定义UnmarshalJSON方法,后续可直接调用标准反序列化接口:

type ActUserList []ActUser

func (al *ActUserList) UnmarshalJSON(data []byte) error {
    var strs []string
    if err := json.Unmarshal(data, &strs); err != nil {
        return err
    }
    *al = make(ActUserList, 0, len(strs))
    for _, s := range strs {
        var u ActUser
        if err := json.Unmarshal([]byte(s), &u); err != nil {
            return err
        }
        *al = append(*al, u)
    }
    return nil
}

// 后续使用方式
var try ActUserList
err = json.Unmarshal(bodyBytes, &try)

内容的提问来源于stack exchange,提问作者masterchief164

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:48:03