我有这个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, ¶ms)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
}
我收到错误json: cannot unmarshal object into Go value of type []main.paramsInfo
我不明白为什么。你能救我吗?
答案 0 :(得分:6)
JSON源是单个对象,但您尝试将其解组为切片。将params
的类型更改为paramsInfo
(非切片):
var params paramsInfo
err := json.Unmarshal(rawJSON, ¶ms)
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
相反)。