如果 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 請求并將回應轉換為產品切片的部分代碼:
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 here
json.Unmarshal(body, &products)
uj5u.com熱心網友回復:
您可以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"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343549.html
上一篇:golang時差條件(子)
