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

8 回复

使用这个在线工具,它可以将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)
}

参见 https://play.golang.org/p/Nqxl-S4Pqn9

你的代码中,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"`

回到顶部