【问题标题】:json: cannot unmarshal string into Go value of type []main.KVUjson:无法将字符串解组为 []main.KVU 类型的 Go 值
【发布时间】:2018-07-23 12:20:45
【问题描述】:

我是 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

}

但我收到此运行时错误

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"
    }
  ]
}

我尝试了不同的类型定义,例如下面的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"`
}

但这也导致:

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

我该如何解决这个问题?

【问题讨论】:

  • Go 数据结构的结构必须与 JSON 匹配。您的 JSON 是一个对象,因此编组为结构而不是切片(这适用于 JSON 数组)。

标签: json go struct


【解决方案1】:

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

func Unquote(s string) (string, error)

Unquote 将 s 解释为单引号、双引号或反引号 Go 字符串文字,返回 s 引号的字符串值。 (如果 s 是 单引号,它将是一个 Go 字符文字;取消引用返回 对应的一字串。)

检查以下工作代码:

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

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"`
}

func main() {
    result := getUserRandking()
    fmt.Println(result)
}

func getUserRandking() []KVU{
    input := `"{\"name\":\"userslist\",\"children\":[{\"name\":\"kachalmooferfer\",\"value\":444,\"url\":\"http://pbs.twimg.com/p‌​rofile_images/989898400609992704/UE8HiRVx_normal.jpg\"},{\"name\":\"patrick_jane7‌​7\",\"value\":407,\"url\":\"http://pbs.twimg.com/profile_images/94467727094959308‌​9/zv62U1ch_normal.jpg\"},{\"name\":\"Pensylvani\",\"value\":213,\"url\":\"http://‌​pbs.twimg.com/profile_images/1018010357892198400/Rw06UWvY_normal.jpg\"}]}"`
    var val []byte = []byte(input)
    jsonInput, err := strconv.Unquote(string(val))
    if err !=nil{
        fmt.Println(err)
    }
    var resp Users
    json.Unmarshal([]byte(jsonInput), &resp)
    // Return below struct slice for Children from the function 
    return resp.Children
}

Go Playground 示例

【讨论】:

  • 好吧,这消除了原来的错误,但现在我得到了:json: cannot unmarshal string into Go value of type main.Users exit status 1
  • 让我检查一下,因为我已经在 Go 操场上测试过它工作正常。
  • 是的,但我需要在 getUserRandking 函数中获取 json。感谢您是否可以修改代码。
  • 嗯,它在那里:代码示例以func getUserRandking() {... 开头,你怎么看?
  • @Babr,然后是 return resp.Children
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2014-02-04
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多