4

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
}
4

2 回答 2

6

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

这不是一个有效的 JSON:

{ "objects": 
    [ 
        {"name": "foo"},
]}

这是一种 Go 语法,如果枚举未在行上关闭(更多内容),则需要使用逗号,例如:

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

// Function call:
fmt.Println(
    "Slice:",
    s,
)

即使您可以“说服”一个特定的 JSON 解析器默默地吞下它,其他有效的 JSON 解析器也会正确地报告错误。不要这样做。

于 2016-08-01T13:50:28.890 回答
2

虽然尾随逗号不是有效的 JSON,但某些语言本身就支持尾随逗号,尤其是 JavaScript,因此您可能会在数据中看到它们。

最好删除尾随逗号,但如果您无法更改数据,请使用支持尾随逗号的 JSON 解析器,例如 HuJSON(又名 Human JSON),它支持 JSON 中的尾随逗号和注释。它是著名的 Xoogler 和前 Golang 团队成员Brad Fitzpatrick和其他人的软分叉encoding/json并由其维护。

语法与Unmarshal相同encoding/json,只需使用:

err := hujson.Unmarshal(data, v)

我已经使用过它,它的工作原理与描述的一样。

于 2021-07-16T07:30:51.203 回答