ホームページ >バックエンド開発 >Golang >Goの「json.Marshal」で空のネストされた構造体を省略するにはどうすればよいですか?

Goの「json.Marshal」で空のネストされた構造体を省略するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-09 07:49:051001ブラウズ

How to Omit Empty Nested Structs in Go's `json.Marshal`?

golang json marshal: 空のネストされた構造体を省略する方法

複雑な JSON エンコード シナリオでは、ネストされた空の構造体が省略されるべきときにもエンコードされる状況に遭遇することがあります。スペースと効率の目的のため。たとえば、次のコード スニペットを考えてみましょう:

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}
type Total struct {
    A ColorGroup `json:",omitempty"`
    B string     `json:",omitempty"`
}

空の A フィールドを持つ Total のインスタンスで json.Marshal が使用される場合、出力 JSON には引き続き表示されます:

group := Total{
    A: ColorGroup{},  // An empty ColorGroup instance
}

json.Marshal(group) // Output: {"A":{"Name":"","Colors":null},"B":null}

望ましい結果は、A フィールドを完全に省略することです:

{"B":null}

解決策: ポインターを使用する型

この問題に対処する鍵は、ポインターの使用にあります。 Total の A フィールドがポインターとして宣言されている場合、明示的に割り当てられていない場合は自動的に nil に設定され、空の構造体のエンコーディングの問題が解決されます。

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}
type Total struct {
    A *ColorGroup `json:",omitempty"`  // Using a pointer to ColorGroup
    B string     `json:",omitempty"`
}

この変更により、json.Marshal の出力が空の A フィールドが正しく省略されるようになりました:

group := Total{
    B: "abc",  // Assigning a value to the B field
}

json.Marshal(group) // Output: {"B":"abc"}

以上がGoの「json.Marshal」で空のネストされた構造体を省略するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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