ホームページ >バックエンド開発 >Golang >Go で JSON にマーシャリングするときに、ネストされた空の構造体を適切に処理するにはどうすればよいですか?

Go で JSON にマーシャリングするときに、ネストされた空の構造体を適切に処理するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-18 06:41:10555ブラウズ

How Do I Properly Handle Nested Empty Structs When Marshaling to JSON in Go?

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 マーシャリングのドキュメントには、構造体フィールドが空であるとみなされると記載されています。

  • Nil ポインター
  • ゼロ値 (例: false、0)

提供された例では、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"}.

注:

  • ゼロ以外の構造体へのポインターが渡された場合、それは JSON 出力に含まれます。
  • この解決策は、ネストされた構造体にのみ適用できます。ネストされていない空の構造体の場合は、ポインターなしで「,omitempty」タグを使用するだけで十分です。

以上がGo で JSON にマーシャリングするときに、ネストされた空の構造体を適切に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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