ホームページ >バックエンド開発 >Golang >JSON の末尾のカンマ: Go の複合リテラル構文が JSON 解析と競合するのはなぜですか?

JSON の末尾のカンマ: Go の複合リテラル構文が JSON 解析と競合するのはなぜですか?

DDD
DDDオリジナル
2024-10-28 20:17:31402ブラウズ

  Trailing Commas in JSON: Why Does Go's Composite Literal Syntax Conflict with JSON Parsing?

Go での JSON 解析における末尾のカンマ構文エラー

Go の著名な専門家である Dave Cheney は、複合リテラル宣言における末尾のカンマの要件を強調しています。ただし、このルールは JSON 解析と競合するようです。

次のコードを検討してください。

<code class="go">// package, imports omitted for brevity

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
}</code>

末尾のカンマを削除すると、実行時エラーが解決されます。 Go はこの不一致の修正をサポートしていますか?

解決策

残念ながら、解決策はありません。 JSON 仕様では、末尾のカンマは許可されません。 Go 構文では複合リテラルの末尾にカンマを付けることが義務付けられていますが、この要件は JSON 解析には適用されません。

つまり、次の JSON は無効です。

<code class="json">{ "objects": 
    [ 
        {"name": "foo"},
]}</code>

特定のJSON パーサーは末尾のカンマを無視します。他の有効な JSON パーサーを使用するときにエラーが発生する可能性があるため、この方法は避けてください。

以上がJSON の末尾のカンマ: Go の複合リテラル構文が JSON 解析と競合するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。