Golang では、通常、オブジェクトを JSON に変換するために、encoding/json.Marshal 関数が使用されます。ただし、デフォルト設定では、目的の JSON レイアウトと一致しない可能性があります。この記事では、デフォルトのレイアウトをオーバーライドし、JSON マーシャリング中に time.Time フィールドで使用される形式をカスタマイズするソリューションを説明します。
starttime という名前の time.Time フィールドを持つ struct があると仮定します。この構造体を JSON にマーシャリングするときは、特定のカスタム レイアウトを使用する必要があります。
s := {"starttime":time.Now(), "name":"ali"}
これを実現するには、time.Time を埋め込み、MarshalText メソッドと MarshalJSON メソッドの両方をオーバーライドするカスタム タイプを作成します。
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
}
MarshalText をオーバーライドすることで、jsonTime 型がその値をテキスト形式に変換する方法を制御し、カスタム レイアウトを指定できるようにします。さらに、MarshalJSON をオーバーライドすることで、JSON マーシャリングの組み込み time.Time 実装の代わりにオーバーライドされたメソッドが使用されるようになります。
カスタム jsonTime タイプを使用すると、必要なレイアウトを使用して s struct をマーシャリングできるようになります。 :
jt := jsonTime{time.Now(), time.Kitchen}
x := map[string]interface{}{
"foo": jt,
"bar": "baz",
}
data, err := json.Marshal(x)
if err != nil {
panic(err)
}
これにより、time.Kitchen レイアウトに従ってフォーマットされた starttime フィールドを含む JSON 文字列が生成されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3