Golang实现外部API响应转自有API格式的字段映射问题
解决方案
直接在遍历逻辑里补全跨结构体的字段显式赋值即可,不需要额外引入复杂的映射库。
核心转换逻辑实现
你定义的Brawler结构体里,ID字段已经映射了第三方返回的id值,Username字段已经映射了第三方返回的Name值,遍历的时候直接把这两个字段对应赋值给Champion的同语义字段就行,补全后的sortBrawler函数代码如下:
func sortBrawler(brawlers []Brawler) []Champion { // 预分配切片容量,减少append操作的内存扩容开销 champions := make([]Champion, 0, len(brawlers)) for _, brawler := range brawlers { champions = append(champions, Champion{ Id: brawler.ID, NickName: brawler.Username, }) } return champions }
现有代码的额外修正点
你当前的接口处理逻辑还有两个容易踩的问题,一并修正即可:
json.Unmarshal调用没有处理错误返回,一旦第三方返回格式异常、反序列化失败,后续逻辑会拿到空数据运行,需要加错误判断- 接口最后写响应时,
json.NewEncoder编码的是原始第三方结构items,不是你转换完成的champions,等于做了无用功,需要替换编码对象
修正后的接口核心段代码:
// 反序列化响应到结构体 err = json.Unmarshal(resp.Body(), &items) if err != nil { http.Error(w, "数据源解析失败", http.StatusInternalServerError) return } // 转换数据格式 champions := sortBrawler(items.Items) w.Header().Set("Content-Type", "application/json") // 返回转换后的自有结构数据 json.NewEncoder(w).Encode(champions)
如果后续你需要在自有接口返回
starPowers、gadgets这类嵌套字段,只需要给Champion结构体增加对应属性,再补全嵌套结构体的字段映射逻辑即可,当前需求只映射id和昵称的话不需要处理这些冗余字段。
内容的提问来源于stack exchange,提问作者Eloi Jahan
相关产品推荐
相关产品推荐

