簡體   English   中英

json:無法將字符串解組為[] main.KVU類型的Go值

[英]json: cannot unmarshal string into Go value of type []main.KVU

我是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類型的Go值。

我怎樣才能解決這個問題?

該錯誤是因為您必須創建Users結構而不是KUV才能解組JSON。 因為[] KVU是一個切片,它將解組作為對象數組的children級數組。 另外,您還需要解析從服務器返回的Json以刪除轉義字符,例如/ 使用strconv.Unquote來管理轉義的JSON。

func Unquote(s string) (string, error)

Unquote將s解釋為單引號,雙引號或反引號的Go字符串文字,並返回s引用的字符串值。 (如果s用單引號引起來,它將是Go字符文字; Unquote返回相應的單字符字符串。)

檢查以下工作代碼:

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
}

去操場的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM