解析JSON数组时的运行时错误,并使用尾随逗号映射元素

Lau*_*ent 1 json go gofmt

Go的主要主题专家之一Dave Cheney写道:"在使用复合文字初始化变量时,Go要求复合文字的每一行以逗号结尾,即使是声明的最后一行.这是分号规则的结果."

但是,当我尝试将这个漂亮的规则应用于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
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

那没有.的JSON规范不允许尾随逗号.

这不是有效的JSON:

{ "objects": 
    [ 
        {"name": "foo"},
]}
Run Code Online (Sandbox Code Playgroud)

这是一个Go语法,如果枚举没有在行关闭,你需要使用逗号(更多内容),例如:

// Slice literal:
s := []int {
    1,
    2,
}

// Function call:
fmt.Println(
    "Slice:",
    s,
)
Run Code Online (Sandbox Code Playgroud)

即使您可以"说服"一个特定的JSON解析器以静默方式吞下它,其他有效的JSON解析器也会报告错误.不要这样做.