json 错误,无法将对象解组为 Go 值

Posted

技术标签:

【中文标题】json 错误,无法将对象解组为 Go 值【英文标题】:json error, cannot unmarshal object into Go value 【发布时间】: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

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

【问题讨论】:

错误的哪一部分让您感到困惑?它可以准确地告诉您问题所在。 【参考方案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 answer 和this answer。 解决方案:params2 := make(map[string][]int)_= json.Unmarshal(rawJSON, &params2)fmt.Printf("\nparams2: %+v", params2)

以上是关于json 错误,无法将对象解组为 Go 值的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符串解组为 int64 类型的 Go 值

恐慌:json:无法将数组解组为 main.Structure 类型的 Go 值

将 json 数组解组为 go struct(数组在 JSON 字符串的中间

部分 JSON 在 Go 中解组为地图

部分JSON解组到Go中的地图中

如何将 SOAP XML 解组为 Java 对象 [重复]