Go での JSON マーシャリングでの入れ子になった空の構造体の処理
はじめに
エンコーディングを使用する場合Go の /json パッケージは、構造体を JSON にマーシャリングします。 「,omitempty」タグを使用すると、結果の JSON から空のフィールドを除外できます。ただし、このタグは、ネストされた構造体では期待どおりに動作しない可能性があります。
質問
次の例を考えてみましょう:
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A ColorGroup `json:",omitempty"` B string `json:",omitempty"` } group := Total{ A: ColorGroup{}, } json.Marshal(group)
このシナリオでは、 A フィールドが空であるため、JSON 出力には B フィールドのみが含まれる必要があります。ただし、出力には空の値を持つ A フィールドが含まれています ({"A": {"Name": "", "Colors": null}, "B": null})。
回答
Go での JSON マーシャリングのドキュメントには、構造体フィールドが空であるとみなされると記載されています。
提供された例では、group.A は空の構造体です。 nil ポインターやコレクション型 (スライス、マップなど) ではありません。したがって、マーシャラーによって空の値として扱われません。
目的の動作を実現するには、ネストされた構造体へのポインターを使用できます。
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A *ColorGroup `json:",omitempty"` B string `json:",omitempty"` } group := Total{ B: "abc", } json.Marshal(group)
この変更により、JSON出力には B フィールドのみが含まれます: {"B": "abc"}.
注:
以上がGo で JSON にマーシャリングするときに、ネストされた空の構造体を適切に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。