在Go中解组JSON数组

Spedwards:

我在这里阅读了一些答案,似乎没有帮助。我不断收到相同的错误:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章