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

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

Susan Sarandon
リリース: 2024-12-22 10:55:11
オリジナル
368 人が閲覧しました

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

time.Time フィールドを使用した JSON のomitempty: カスタム ソリューション

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

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