arrays - 在 Go 中解码 JSON 数组

标签 arrays json go unmarshalling

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

json: cannot unmarshal array into Go value of type A


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 .所以json输入需要是[{ "arr": ["list", "of", "names"]}, {"arr": ["more", "names"]}]例如,给定您上面的示例。
但是,您可以在名为 A 的类型上定义 UnmarshalJSON。 , 像这样:

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。在这种情况下,我们尝试解码为一个普通的 slice - string ——变量s ——只要 json 本身是字符串 slice 的有效初始化程序,它就可以工作。
如果解码成功,则设置 p.Arr ,知道该数组仅用于名为 Arr 的事物(实际上是结构类型的唯一成员)并返回 nil (没有错误)。
注意最后几行可以写成:
if err == nil {
    p.Arr = s
}
return err
这更短,但 Go 约定通常首先处理错误情况,而不是让它通过。 (实际上,我自己更喜欢较短的代码,但请使用您的团队喜欢的任何代码。)
(给定类型上的 UnmarshalJSON 接收器,该类型上可能也应该有一个 json 编码(marshal)器,但我的最小 test-and-example on the Go playground 没有。)

关于arrays - 在 Go 中解码 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63324035/

相关文章:

go - 在 go 程序后台运行的 Websockets 导致 100% CPU 使用率

去大内存垃圾回收性能

http - 如何与 Golang 一起使用 nginx 作为反向代理?

javascript - 将 Viewbag 中的内容存储到本地 jquery 数组或对象中

java - 从服务器搜索 json 数组的搜索栏

php - SQL 将整个结果中的一个值移动到顶部

php - 使用 PHP 从 HTTP_Request2_Response 对象中提取数据

json - 在 REST API 中索引数组集合元素

Java - 合并两个数组而不重复(不允许使用库)

java - 根据用户输入查找数组中的最大数字