猿问

使用 Go 将复杂的 http json 响应数组转换为简单的结构切片,而无需创建多个结构来匹配响应

如果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 here

json.Unmarshal(body, &products)


POPMUISE
浏览 141回答 1
1回答

哆啦的时光机

ProductRes您可以使用匿名类型消除声明的类型:var wrapper struct { Items []Product }err := json.Unmarshal(body, &wrapper)if err != nil {    // TODO: handle error}products := wrapper.Items您还可以使用地图:var m map[string][]Producterr := json.Unmarshal(body, &m)if err != nil {    // TODO: handle error}products := m["items"]
随时随地看视频慕课网APP

相关分类

Go
我要回答