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 サイトの他の関連記事を参照してください。