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, ¶ms)
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, ¶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]
【讨论】:
如何在结构中不明确声明“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 值的主要内容,如果未能解决你的问题,请参考以下文章
恐慌:json:无法将数组解组为 main.Structure 类型的 Go 值