ホームページ > バックエンド開発 > Golang > Go の JSON マーシャリング/アンマーシャリングで `time.Time` フィールドを使用して `omitempty` を効果的に処理する方法は?

Go の JSON マーシャリング/アンマーシャリングで `time.Time` フィールドを使用して `omitempty` を効果的に処理する方法は?

Patricia Arquette
リリース: 2024-12-26 17:46:10
オリジナル
986 人が閲覧しました

How to Effectively Handle `omitempty` with `time.Time` Fields in Go's JSON Marshaling/Unmarshaling?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート