【问题标题】:json error, cannot unmarshal object into Go valuejson 错误,无法将对象解组为 Go 值
【发布时间】:2018-05-06 02:36:57
【问题描述】:

我有这个 JSON 数据:

{
"InfoA" : [256,256,20000],
"InfoB" : [256,512,15000],
"InfoC" : [208,512,20000],
"DEFAULT" : [256,256,20000]
}

使用JSON-to-Go,我得到了这个 Go 类型定义:

type AutoGenerated struct {
    InfoA   []int `json:"InfoA"`
    InfoB   []int `json:"InfoB"`
    InfoC   []int `json:"InfoC"`
    DEFAULT []int `json:"DEFAULT"`
}

使用此代码 (play.golang.org)

package main

import (
    "encoding/json"
    "fmt"
    "os"
    "strings"
)

func main() {
    type paramsInfo struct {
        InfoA   []int `json:"InfoA"`
        InfoB   []int `json:"InfoB"`
        InfoC   []int `json:"InfoC"`
        DEFAULT []int `json:"DEFAULT"`
    }
    rawJSON := []byte(`{
"InfoA" : [256,256,20000],
"InfoB" : [256,512,15000],
"InfoC" : [208,512,20000],
"DEFAULT" : [256,256,20000]
}`)
    var params []paramsInfo
    err := json.Unmarshal(rawJSON, &params)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
}

我收到错误json: cannot unmarshal object into Go value of type []main.paramsInfo

我不明白为什么。你能帮帮我吗?

【问题讨论】:

  • 错误的哪一部分让您感到困惑?它可以准确地告诉您问题所在。

标签: json go struct slice


【解决方案1】:

您正在解码单个 JSON 对象,但您正试图将其放入 []paramsInfo 切片中。

解码 JSON 对象数组时效果很好:

rawJSON := []byte(`[{
    "InfoA" : [256,256,20000],
    "InfoB" : [256,512,15000],
    "InfoC" : [208,512,20000],
    "DEFAULT" : [256,256,20000]
}]`)

(注意对象周围的方括号)

顺便说一句,在处理错误的if 分支中,您不需要调用err.Error() 来获取错误字符串; fmt.Println(err) 就足够了,这样使用它实际上是一个 Go 习惯用法。 fmt.Print* 的实现负责处理 error 类型(例如与 print 相反)。

【讨论】:

    【解决方案2】:

    JSON 源是单个对象,但您尝试将其解组为切片。将params的类型改为paramsInfo(非切片):

    var params paramsInfo
    err := json.Unmarshal(rawJSON, &params)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
    fmt.Printf("%+v", params)
    

    然后输出(在Go Playground 上试试):

    {InfoA:[256 256 20000] InfoB:[256 512 15000] InfoC:[208 512 20000]
        DEFAULT:[256 256 20000]}
    

    【讨论】:

    • 如何在结构中不明确声明“InfoA”、“InfoAB”等?我实施了一个解决方案(play.golang.org/p/3NoMXoyOCU),但结果为空。我看不出它是如何实现的。
    • @LeMoussel 见this answerthis answer
    • 解决方案:params2 := make(map[string][]int)_= json.Unmarshal(rawJSON, &params2)fmt.Printf("\nparams2: %+v", params2)
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-03-05
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多