ホームページ > バックエンド開発 > Golang > JSON マーシャリングで Go の「time.Time」を使用して「omitempty」を処理する方法は?

JSON マーシャリングで Go の「time.Time」を使用して「omitempty」を処理する方法は?

Linda Hamilton
リリース: 2024-12-18 17:55:10
オリジナル
581 人が閲覧しました

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

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

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