如果http响应的格式不是直接的对象列表,那么我可以弄清楚如何将它们转换为结构的唯一方法是创建两个结构来匹配响应的确切格式。无论如何,我可以在其中创建一个 Product 结构而不需要创建 ProductRes 包装器结构吗?下面是我调用的 api 响应的示例:{ "items": [ { "name": "Product 1", "price": 20.45 }, { "name": "Product 2", "price": 31.24 } ]}这是我创建的两个结构,用于将 api 响应转换为 Product 切片:type Product struct { Name string `json:"name"` Price float64 `json:"price"`}type ProductRes struct { Items []Product `json:"items"`}以下是发出 api 请求并将响应转换为 Product 切片的部分代码:req, err := http.NewRequest(http.MethodGet, url, nil)if err != nil { log.Fatalln(err)}resp, err := c.client.Do(req)if err != nil { log.Fatalln(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil { log.Fatalln(err)}products := ProductRes{}// This line makes me think I actually do need multiple structs, unless I can modify body somehow prior to sending it in herejson.Unmarshal(body, &products)
1 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
ProductRes您可以使用匿名类型消除声明的类型:
var wrapper struct { Items []Product }
err := json.Unmarshal(body, &wrapper)
if err != nil {
// TODO: handle error
}
products := wrapper.Items
您还可以使用地图:
var m map[string][]Product
err := json.Unmarshal(body, &m)
if err != nil {
// TODO: handle error
}
products := m["items"]
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报
0/150
提交
取消
