英文:
ioutil.ReadAll and unmarshal on nested curl response returns error due to problem in key of array struct
问题
给你提供一些上下文,我正在使用curl命令访问一个第三方的端点,响应的格式类似于以下内容:
{
"code": 200,
"message": "Success",
"data": {
"list": [
{
"user": "user A",
"status": "normal"
},
{
"user": "user B",
"status": "normal"
}
],
"page": 1,
"total_pages": 5000
}
}
你的结构体定义如下:
type User struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
List []struct {
User string `json:"user"`
Status string `json:"status"`
} `json:"list"`
Page int `json:"page"`
TotalPages int `json:"total_pages"`
} `json:"data"`
}
你的代码如下:
defer response.Body.Close()
io_response, err := ioutil.ReadAll(response.Body)
returnData := User{}
err = jsoniter.Unmarshal([]byte(io_response), &returnData)
if err != nil {
log.Println(err)
}
以上代码返回了一个错误:
decode slice: expect [ or n, but found {, error found in #10 byte of ...|:{"list":{"1"
当你使用fmt.Println(string(io_response))
打印响应内容时,结果如下:
{
"code": 200,
"message": "Success",
"data": {
"list": {
"1": {
"user": "user A",
"status": "normal"
},
"2": {
"user": "user A",
"status": "normal"
}
},
"page": 1,
"total_pages": 2000
}
}
请问你能教我如何正确读取响应或者如何解析这个响应吗?谢谢!
英文:
To give you context, I am curling to a third party endpoint, the response is similar to this one
{
"code": 200,
"message": "Success",
"data": {
"list": [
{
"user": "user A",
"status" : "normal"
},
{
"user": "user B",
"status" : "normal"
}
],
"page": 1,
"total_pages": 5000
}
}
My struct is similar to
type User struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
List []struct {
User string `json:"user"`
Status string `json:"status"`
} `json:"list"`
Page int `json:"page"`
TotalPages int `json:"total_pages"`
} `json:"data"`
}
Please check my codes
defer response.Body.Close()
io_response, err := ioutil.ReadAll(response.Body)
returnData := User{}
err = jsoniter.Unmarshal([]byte(io_response), &returnData)
if err != nil {
log.Println(err)
}
The code above returns an error
decode slice: expect [ or n, but found {, error found in #10 byte of ...|:{"list":{"1"
When I do fmt.Println(string(io_response)), it was returned like this:
> { "code": 200, "message": "Success", "data": {
> "list": {
> "1": {
> "user": "user A",
> "status": "normal"
> },
> "2": {
> "user": "user A",
> "status": "normal"
> }
> },
> "page": 1,
> "total_pages": 2000 } }
Can you please teach me how to read the response properly or how to unmarshal this?
Thank you
答案1
得分: 1
你可以像这样定义你的结构体:
type User struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
List map[string]struct {
User string `json:"user"`
Status string `json:"status"`
} `json:"list"`
Page int `json:"page"`
TotalPages int `json:"total_pages"`
} `json:"data"`
}
这段代码定义了一个名为User的结构体,它包含了Code、Message和Data三个字段。其中,Data字段又包含了List、Page和TotalPages三个字段。List字段是一个映射类型,键为字符串,值为一个包含User和Status两个字段的结构体。这些字段都使用了json标签来指定在JSON序列化和反序列化时的名称。
英文:
you can define your struct like this:
type User struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
List map[string]struct {
User string `json:"user"`
Status string `json:"status"`
} `json:"list"`
Page int `json:"page"`
TotalPages int `json:"total_pages"`
} `json:"data"`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论