我在这里阅读了一些答案,似乎没有帮助。我不断收到相同的错误:
json:无法将数组解组为A类型的Go值
type A struct {
Arr []string
}
type MA []A
func UnmarshalJSON() (ma MA, err error) {
jsonFile, err := os.Open(aJsonFile)
// error handling
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
err = json.Unmarshal(byteValue, &ma)
if err != nil {
return ma, err
}
return ma, nil
}
json看起来像这样:
[
["Name", "Another Name", "Another"],
["A", "B"],
["W", "X", "Y", "Z"],
["Foo", "Bar"]
]
我在搜索时尝试了各种不同的方法,从上面的答案中可以看出来,但是如前所述,没有任何效果。
我对Go还是很陌生,并且不得不解组东西(我目前正在解组,[][]string
但是我想使用结构)。我究竟做错了什么?
结构具有字段;字段有名称;您的结构中的字段名称为Arr
。因此[{ "arr": ["list", "of", "names"]}, {"arr": ["more", "names"]}]
,给定您上面的示例,json输入将需要例如。
但是,您可以在名为的类型上定义UnmarshalJSON A
,如下所示:
func (p *A) UnmarshalJSON(data []byte) error {
var s []string
err := json.Unmarshal(data, &s)
if err != nil {
return err
}
p.Arr = s
return nil
}
这个名为的接收器函数UnmarshalJSON
需要一个指向A
对象的指针,以及某种有效的json输入。它的工作是解组该json。在这种情况下,我们尝试解组为普通切片(string
即变量)s
,只要json本身是切片字符串的有效初始化程序,该切片就可以工作。
如果解组成功,则我们将设置p.Arr
,知道该数组仅用于命名的对象Arr
(实际上是结构类型的唯一成员),然后返回nil
(没有错误)。
请注意,最后几行可以写成:
if err == nil {
p.Arr = s
}
return err
较短,但是Go约定通常首先处理错误情况,而不是让错误流过。(实际上,我本人稍微偏爱较短的代码,但要使用小组喜欢的任何方法。)
(考虑UnmarshalJSON
到该类型的接收者,该类型上也可能也应该有一个json封送处理程序,但是我在Go操场上的最小测试和示例没有)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句