Golang では、オブジェクトを JSON に変換するために、encoding/json.Marshal 関数がよく使用されます。ただし、デフォルト設定では、目的の JSON レイアウトと一致しない可能性があります。この記事では、デフォルトのレイアウトをオーバーライドし、JSON マーシャリング中に time.Time フィールドで使用される形式をカスタマイズするソリューションを説明します。
starttime という名前の time.Time フィールドを持つ struct があると仮定しましょう。この構造体を JSON にマーシャリングするときに、特定のカスタム レイアウトを使用したいとします。
s := {"starttime":time.Now(), "name":"ali"}
これを実現するには、time.Time を埋め込み、MarshalText メソッドと MarshalJSON メソッドの両方をオーバーライドするカスタム タイプを作成できます。
<code class="go">import "fmt" import "time" import "encoding/json" type jsonTime struct { time.Time f string } func (j jsonTime) format() string { return j.Time.Format(j.f) } func (j jsonTime) MarshalText() ([]byte, error) { return []byte(j.format()), nil } func (j jsonTime) MarshalJSON() ([]byte, error) { return []byte(`"` + j.format() + `"`), nil }</code>
MarshalText をオーバーライドすることで、jsonTime 型がその値をテキスト形式に変換する方法を制御し、カスタム レイアウトを指定できるようにします。さらに、MarshalJSON をオーバーライドすることで、JSON マーシャリング用の組み込み time.Time 実装の代わりにオーバーライドされたメソッドが使用されるようになります。
カスタム jsonTime 型を使用すると、希望のレイアウトを使用して s 構造体をマーシャリングできるようになりました。 :
<code class="go">jt := jsonTime{time.Now(), time.Kitchen} x := map[string]interface{}{ "foo": jt, "bar": "baz", } data, err := json.Marshal(x) if err != nil { panic(err) }</code>
これにより、time.Kitchen レイアウトに従ってフォーマットされた starttime フィールドを持つ JSON 文字列が生成されます。
以上がGolang で time.Time フィールドの JSON レイアウトをカスタマイズする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。