omitempty による JSON 時間フィールドの省略
JSON シリアル化に時間フィールドを選択的に含めるために、json:",omitempty"というタグがよく使われます。ただし、time.Time フィールドと一緒に使用すると、予期しない動作が発生する可能性があります。
中心的な問題は、構造体としての time.Time の性質にあります。明確な「空」状態 (空の文字列など) を持つ文字列や整数などのスカラー型とは異なり、構造体は初期化されているが空のインスタンスを表す「ゼロ」値を持ちます。この場合、time.Time のゼロ値は、すべてのフィールドをデフォルト値に初期化します。
この区別により、json:",omitempty" はゼロ値の time.Time を " として認識しません。 empty" となり、常に JSON 出力に含まれます。この制限を克服するには、次のいずれかのアプローチを採用できます。
1.ポインター型の使用:
time.Time フィールドをポインター (*time.Time) に変換することにより、JSON 処理では nil ポインターが「空」と見なされるという事実を利用できます。このソリューションにより、コードが簡素化されます:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
2。カスタム マーシャラーとアンマーシャラーを実装する:
ポインターの使用が不可能な場合は、time.Time.IsZero() を利用してフィールドを条件付きで含めたり除外したりするカスタムの JSON マーシャラー メソッドとアンマーシャラー メソッドを構造体に実装できます:
// MarshalJSON implements the custom JSON Marshaler for MyStruct. func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { return json.Marshal(struct{ Alias }{ms.Field}) } return json.Marshal(struct{ Alias }{Alias(ms)}) } // UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct. func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct var as Alias if err := json.Unmarshal(b, &as); err != nil { return err } ms.Field = as.Field if !as.Timestamp.IsZero() { ms.Timestamp = &as.Timestamp } return nil }
カスタム マーシャラー メソッドとアンマーシャラー メソッドを実装するには、基礎となるものをより深く理解する必要があることに注意してください。 JSON のシリアル化と逆シリアル化のプロセス。
以上がJSON マーシャリングで Go の「time.Time」を使用して「omitempty」を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。