Go如何将API响应内容反序列化为带map[string]int字段的ActUser结构体
问题根因
你拿到的字节数组转成明文JSON后结构如下:
["{\"NoOfViews\":{\"0\":0},\"NoOfLikes\":{\"0\":0},\"NoOfComments\":{\"0\":0},\"NoOfShares\":{\"0\":0}}","{}"]
这是一个字符串数组,数组内的每个元素都是转义后的JSON格式字符串,不是直接的JSON对象,所以直接反序列化到[]ActUser类型就会抛出「无法把字符串反序列化为ActUser类型」的错误。
解决方法
分两步处理即可完成反序列化:
- 先把原始字节反序列化为字符串数组
- 遍历字符串数组,逐个将每个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
相关产品推荐
相关产品推荐

