Golang中将JSON转换为Struct的方法
Golang中将JSON转换为Struct的方法 朋友们好!我想将JSON代码保存到我的结构体中。代码如下:
{
"Dogs": [
{
"name": "Alma",
"year_old": 2,
"Description": ["This", "is", "Description", "in", "a", "Vector1"]
},
{
"name": "Tobby",
"year_old": 4,
"Description": ["This", "is", "Description", "in", "a", "Vector2"]
}
}
我的类定义如下:
type Dog struct {
Name string `json:"name"`
Year_old float32 `json:"year_old"`
Description []string `json:"description"`
}
我尝试编写了以下代码,但变量 dogs 是 nil:
func getDogs(w http.ResponseWriter, r *http.Request) {
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "error")
return
}
var dogs []Dog
json.Unmarshal(reqBody, &dogs)
问题在于JSON中的数组 “Dogs: []”。如果移除 “Dogs: []”,变量 dogs 就能包含那两个对象。
谢谢。 再见,朋友们。 抱歉我的英语很基础。
更多关于Golang中将JSON转换为Struct的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
使用这个在线工具,它可以将JSON转换为Go结构体。
更多关于Golang中将JSON转换为Struct的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我不太确定你上一个帖子想表达什么,抱歉。
现在它工作了吗?
你确定 reqBody 包含了你期望的 JSON 数据吗?如果是,我上面展示的代码应该能正常工作。如果不是,请求体具体包含什么内容?
抱歉,我原本写的是:
func main() {
var dogs []Dogs <-------------------- 错误在于 Dogs
json.Unmarshal([]byte(j), &dogs)
fmt.Println(dogs)
}
谢谢!!!
检查 unmarschal 的错误,它提示了什么?
通常,至少在调试时,记录完整的返回错误以及可能导致该错误的数据总是一个好主意。
一般来说,每当函数或方法返回错误值时,你都应该检查它,尽管 Lutz 在他的示例中省略了这一点。
嗨!dogs 返回 nil。我完全按照你提到的方法做了,只是我把 j 替换成了 reqBody:
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "error en datos enviados")
return
}
你的JSON数据并不包含一个数组,而是一个包含名为Dogs成员的对象,该成员的值是一个数组。你需要在代码中体现这一点。
type Dog struct {
Name string `json:"name"`
Year_old float32 `json:"year_old"`
Description []string `json:"description"`
}
type Dogs struct {
Dogs []Dog `json:"Dogs"`
}
func main() {
var dogs Dogs
json.Unmarshal([]byte(j), &dogs)
fmt.Println(dogs)
}
你的代码中,dogs 为 nil 是因为 JSON 结构包含了一个顶层的 Dogs 字段,而你的代码尝试直接解析为 []Dog。你需要创建一个结构体来匹配 JSON 的顶层结构。以下是修正后的代码:
type DogsResponse struct {
Dogs []Dog `json:"Dogs"`
}
func getDogs(w http.ResponseWriter, r *http.Request) {
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "error")
return
}
var response DogsResponse
err = json.Unmarshal(reqBody, &response)
if err != nil {
fmt.Fprintf(w, "unmarshal error: %v", err)
return
}
dogs := response.Dogs
// 现在 dogs 包含解析后的数据
}
如果你的 JSON 键是大小写敏感的,确保结构体标签匹配 JSON 中的键名。在你的例子中,JSON 使用大写的 "Dogs",所以结构体标签需要是 `json:"Dogs"`。

