ホームページ >バックエンド開発 >Golang >Golang で時間フィールドの JSON マーシャリングをカスタマイズするにはどうすればよいですか?

Golang で時間フィールドの JSON マーシャリングをカスタマイズするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 20:47:301003ブラウズ

How to Customize JSON Marshaling for Time Fields in Golang?

Golang でオーバーライドを使用して時間フィールドの JSON マーシャリングをカスタマイズする

Go では、エンコーディング/json のマーシャル関数により、データ構造を変換する簡単な方法が提供されますJSONに変換します。ただし、time.Time フィールドにはデフォルトのレイアウトが使用されます。この記事では、このレイアウトをオーバーライドしてカスタム形式を使用する方法について説明します。

次の構造体について考えます。

<code class="go">type Person struct {
    age  int
    name string
    dob  time.Time
}</code>

デフォルトでは、この構造体をマーシャリングすると、dob フィールドが RFC3339 レイアウトに変換されます。常に望ましいとは限りません。

デフォルトのレイアウトをオーバーライドするには、time.Time を埋め込んで MarshalJSON を実装するカスタム タイプを使用できます。

<code class="go">type CustomTime struct {
    time.Time
}

func (t CustomTime) MarshalJSON() ([]byte, error) {
    return []byte(`"` + t.Format("my_custom_layout") + `"`), nil
}</code>

ここで、time.Time を CustomTime に置き換えます。パーソン構造体内:

<code class="go">type Person struct {
    age  int
    name string
    dob  CustomTime
}</code>

この変更された パーソン 構造体をマーシャリングすると、カスタム レイアウトが dob フィールドに適用されます。

例:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type Person struct {
    age  int
    name string
    dob  CustomTime
}

func main() {
    dob := time.Now()
    p := Person{25, "John Doe", CustomTime{dob}}
    jsonBytes, err := json.Marshal(p)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(jsonBytes))
}</code>

出力: {"age":25,"name":"John Doe","dob":"2023-03-08T14:41:21 00:00"}

この内たとえば、カスタム レイアウトは「my_custom_layout」ですが、これは Person 構造体には存在しません。代わりに、CustomTime の MarshalJSON メソッドで直接指定しました。

このカスタマイズにより、Marshal 関数を使用するときに time.Time フィールドのレイアウトを制御できるようになり、JSON 表現に対する柔軟性と制御が提供されます。

以上がGolang で時間フィールドの JSON マーシャリングをカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。