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

时间:2017-11-22 11:14:03

标签: json go

我有这个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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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相反)。