如果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 關注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消