Dave Cheney 是 Go 领域的主要主题专家之一,他写道:“当使用复合文字初始化变量时,Go 要求复合文字的每一行都以逗号结尾,即使是声明的最后一行也是如此。这是 semicolon rule 的结果。”
但是,当我试图将这个漂亮的规则应用到 JSON 文本时,解析器似乎并不同意这个理念。在下面的代码中,删除逗号有效。是否有解决此问题的方法,以便在差异中添加元素时我只能看到一行更改?
package main
import (
"fmt"
"encoding/json"
)
type jsonobject struct {
Objects []ObjectType `json:"objects"`
}
type ObjectType struct {
Name string `json:"name"`
}
func main() {
bytes := []byte(`{ "objects":
[
{"name": "foo"}, // REMOVE THE COMMA TO MAKE THE CODE WORK!
]}`)
jsontype := &jsonobject{}
json.Unmarshal(bytes, &jsontype)
fmt.Printf("Results: %v\n", jsontype.Objects[0].Name) // panic: runtime error: index out of range
}
最佳答案
没有。 JSON specification不允许尾随逗号。
这不是有效的 JSON:
{ "objects":
[
{"name": "foo"},
]}
这是一种 Go 语法,如果枚举未在行(more on this)上结束,则需要使用逗号,例如:
// Slice literal:
s := []int {
1,
2,
}
// Function call:
fmt.Println(
"Slice:",
s,
)
即使您可以“说服”一个特定的 JSON 解析器默默地吞下它,其他有效的 JSON 解析器也会正确地报告错误。不要这样做。
关于json - 解析带有尾随逗号的 JSON 数组和 map 元素时出现运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700513/