omitempty タグ オプションは、構造体であるため、time.Time では機能しません。これは、time.Time の「ゼロ」値がすべてのフィールド値がゼロに設定された有効な値であることを意味します。これは、json エンコーダーによって「空」として扱われません。
この課題を克服するには、次のようにします。 time.Time (*time.Time) へのポインターを使用し、カスタムのエンコードとデコードを実装するカスタム アプローチを検討してみましょう。
ポインターに切り替えると、nil 値は JSON エンコーダーによって「空」として解釈されます。
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
ポインターを使用すると、カスタムのマーシャラーとアンマーシャラーを実装できますインターフェイス:
type MyStruct struct { Timestamp time.Time `json:"Timestamp"` Date time.Time `json:"Date"` Field string `json:"Field"` } func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { ms.Timestamp = time.Time{} } if ms.Date.IsZero() { ms.Date = time.Time{} } return json.Marshal(Alias(ms)) } func (ms *MyStruct) UnmarshalJSON(data []byte) error { type Alias MyStruct aux := &Alias{} if err := json.Unmarshal(data, aux); err != nil { return err } *ms = MyStruct(aux) return nil }
ここで、MarshalJSON メソッドはゼロ値の time.Time インスタンスを同等の Go ゼロ値に設定し、空のフィールドの処理を有効にします。
ポインタベースのソリューションは簡単で効果的です。ただし、ポインターの使用が不可能な場合は、カスタムのマーシャラー/アンマーシャラーのアプローチにより、空の time.Time 値を処理する柔軟な方法が提供されます。
以上がGo JSON マーシャリングで `time.Time` フィールドを使用して `omitempty` を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。