json:无法将字符串解组为 []main.KVU 类型的 Go 值

Bab*_*abr 3 json struct go

我是 golang 新手,我想在我的代码中添加一个 json 对象:

func getUserRandking() []KVU {    
    url := "http://127.0.0.1:8080/users"

    spaceClient := http.Client{         Timeout: time.Second * 10, 
    }

    req, err := http.NewRequest(http.MethodGet, url, nil)
    if err != nil {
        log.Fatal(err)
    }

    req.Header.Set("User-Agent", "spacecount-tutorial")

    res, getErr := spaceClient.Do(req)
    if getErr != nil {
        log.Fatal(getErr)
    }

    body, readErr := ioutil.ReadAll(res.Body)
    if readErr != nil {
        log.Fatal(readErr)
    }

    var users1 []KVU
    jsonErr := json.Unmarshal(body, &users1)
    if jsonErr != nil {
        log.Fatal(jsonErr)
    }

    fmt.Println(users1)

    return users1

}
Run Code Online (Sandbox Code Playgroud)

但我收到这个运行时错误

json:无法将字符串解组为 []main.KVU 类型的 Go 值退出状态 1

我尝试导入的 json 是这样的:

{
  "name": "userslist",
  "children": [
    {
      "name": "cat",
      "value": 1,
      "url": "http://example.com/1.jpg"
    },
    {
      "name": "dog",
      "value": 2,
      "url": "http://example.com/2.jpg"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试过不同的类型定义,如下所示Users

type KVU struct {
    Key   string `json:"name"`
    Value int    `json:"value"`
    Url   string `json:"url"`
}

type Users struct {
    Name     string `json:"name"`
    Children []KVU  `json:"children"`
}
Run Code Online (Sandbox Code Playgroud)

但这也导致:

json:无法将字符串解组为 []main.Users 类型的 Go 值

我怎样才能解决这个问题?

Him*_*shu 6

该错误是因为您必须创建Users结构而不是KUV解组 JSON。由于 []KVU 是一个切片,它将解组其数组,children该数组是对象数组。此外,您还需要解析从服务器返回的 Json 以删除转义字符,例如/. 用于strconv.Unquote管理转义 JSON。

\n\n
func Unquote(s string) (string, error)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

Unquote 将 s 解释为单引号、双引号或反引号\n Go 字符串文字,返回 s 引用的字符串值。(如果 s 被单引号括起来,那么它将是 Go 字符文字;取消引号会返回对应的单字符字符串。)

\n
\n\n

检查下面的工作代码:

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "strconv"\n)\n\ntype KVU struct {\n    Key   string `json:"name"`\n    Value int    `json:"value"`\n    Url   string `json:"url"`\n}\n\ntype Users struct {\n    Name     string `json:"name"`\n    Children []KVU  `json:"children"`\n}\n\nfunc main() {\n    result := getUserRandking()\n    fmt.Println(result)\n}\n\nfunc getUserRandking() []KVU{\n    input := `"{\\"name\\":\\"userslist\\",\\"children\\":[{\\"name\\":\\"kachalmooferfer\\",\\"value\\":444,\\"url\\":\\"http://pbs.twimg.com/p\xe2\x80\x8c\xe2\x80\x8brofile_images/989898400609992704/UE8HiRVx_normal.jpg\\"},{\\"name\\":\\"patrick_jane7\xe2\x80\x8c\xe2\x80\x8b7\\",\\"value\\":407,\\"url\\":\\"http://pbs.twimg.com/profile_images/94467727094959308\xe2\x80\x8c\xe2\x80\x8b9/zv62U1ch_normal.jpg\\"},{\\"name\\":\\"Pensylvani\\",\\"value\\":213,\\"url\\":\\"http://\xe2\x80\x8c\xe2\x80\x8bpbs.twimg.com/profile_images/1018010357892198400/Rw06UWvY_normal.jpg\\"}]}"`\n    var val []byte = []byte(input)\n    jsonInput, err := strconv.Unquote(string(val))\n    if err !=nil{\n        fmt.Println(err)\n    }\n    var resp Users\n    json.Unmarshal([]byte(jsonInput), &resp)\n    // Return below struct slice for Children from the function \n    return resp.Children\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Go 游乐场示例

\n