omitempty を使用した time.Time フィールドの JSON マーシャリング/アンマーシャリングのカスタマイズ
このシナリオでは、JSON の time.Time フィールドでomitemptyを使用します。マーシャリング/アンマーシャリング操作は、他のデータ型ほど単純ではありません。デフォルトでは、time.Time は構造体であり、omitempty はそのゼロ値を空として扱いません。
解決策 1: ポインターを使用する
これを解決するには、 time.Time フィールドからポインター (*time.Time) へのフィールド。ポインタには nil 値があり、JSON では空として扱われます。
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
この変更により、nil ポインタを持つフィールドは JSON 出力で省略されます。
解決策 2 : カスタム マーシャラー/アンマーシャラー
または、カスタム マーシャラーを実装し、 time.Time フィールドを処理するアンマーシャラー。マーシャラーで、Time.IsZero() メソッドを使用して、time.Time 値が空かどうかを確認します。空の場合は、null の JSON 値を返します。 Unmarshaler で、null の JSON 値を time.Time のゼロ値に変換します。
例:
type MyStruct struct { Timestamp time.Time `json:",omitempty"` Date time.Time `json:",omitempty"` Field string `json:",omitempty"` } func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct var null NullTime if ms.Timestamp.IsZero() { null = NullTime(ms.Timestamp) } return json.Marshal(&struct { Alias Timestamp NullTime `json:"Timestamp"` }{ Alias: Alias(ms), Timestamp: null, }) } func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct aux := &struct { *Alias Timestamp NullTime `json:"Timestamp"` }{ Alias: (*Alias)(ms), } if err := json.Unmarshal(b, &aux); err != nil { return err } ms.Timestamp = time.Time(aux.Timestamp) return nil } // NullTime represents a time.Time that can be null type NullTime time.Time func (t NullTime) MarshalJSON() ([]byte, error) { if t.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", time.Time(t).Format(time.RFC3339))), nil } func (t *NullTime) UnmarshalJSON(b []byte) error { str := string(b) if str == "null" { *t = NullTime{} return nil } ts, err := time.Parse(time.RFC3339, str[1:len(str)-1]) if err != nil { return err } *t = NullTime(ts) return nil }
以上がGo の JSON マーシャリング/アンマーシャリングで `time.Time` フィールドを使用して `omitempty` を効果的に処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。