json - 解析带有尾随逗号的 JSON 数组和 map 元素时出现运行时错误

标签 json go gofmt

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/

相关文章:

javascript/json 存储严格索引的数组

go - 为什么 "fmt.Sprintf("%v ,", lines[i])"将逗号放在新行上?

go - 在 Go 中合并 map

go - Golang 中具体类型的错误片段

git - 在每次提交时分别运行 go fmt 时,是否有任何工具会重新设置 Git 中的分支?

jQuery.ajax 事件在 IE8 中无法正确触发(加载 Fiddler 时除外)

Jquery (JSON) - 如何阅读 Twitter 趋势词?

json - JSON POST 请求中的参数在 Swift 中被忽略了吗?

go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法?