1. ホーム
  2. json

[解決済み] Goで空の構造体をJSONにマーシャルしない方法とは?

2022-09-11 04:36:38

質問

このような構造体を持っています。

type Result struct {
    Data       MyStruct  `json:"data,omitempty"`
    Status     string    `json:"status,omitempty"`
    Reason     string    `json:"reason,omitempty"`
}

しかし、MyStructのインスタンスが完全に空であっても(つまり、すべての値がデフォルトであっても)、シリアライズされるのは、以下のようになります。

"data":{}

というのは知っていますが エンコーディング/json docs は "empty" フィールドがそうであると指定しています。

false、0、任意のnilポインタまたはインタフェース値、および任意の配列。 スライス、マップ、または長さ0の文字列。

のように、すべての値が空またはデフォルトである構造体は考慮されません。また、そのすべてのフィールドは、タグ付けされています。 omitempty でタグ付けされていますが、これは何の効果もありません。

どうすれば、JSON パッケージを ではなく をマーシャリングさせることができますか?

どのように解決するのですか?

ドキュメントにあるように、"any nil pointer." -- 構造体をポインタにします。ポインタは明らかに "empty" の値を持っています。 nil .

修正 - 構造体を用いて型を定義する ポインタ フィールドで型を定義します。

type Result struct {
    Data       *MyStruct `json:"data,omitempty"`
    Status     string    `json:"status,omitempty"`
    Reason     string    `json:"reason,omitempty"`
}

では、このような値。

result := Result{}

としてマーシャリングされます。

{}

説明 この *MyStruct に注目してください。JSONのシリアライゼーションでは、ポインタであるかどうかは気にしませんが、それはランタイムの詳細です。つまり、構造体フィールドをポインタにすることは、コンパイル時と実行時にのみ意味があります)。

ただ、フィールドの型を MyStruct から *MyStruct のように、構造体へのポインタが必要です。

Data: &MyStruct{ /* values */ }