Go での JSON 時間アンマーシャリングのカスタマイズ
時間値を含む JSON データを扱う場合、Go のエンコード/json パッケージによって制限が生じる可能性があります。時刻形式が RFC 3339 に準拠していない場合。時刻を手動で RFC 3339 に変換することは可能ですが、
マーシャラー/アンマーシャラー インターフェイスを実装する
カスタムの時間形式を処理するには、json.Marshaler とjson.Unmarshaler インターフェイス。これにより、時間値をシリアル化および逆シリアル化する方法を定義できます。
CustomTime というカスタム タイプの例を次に示します:
type CustomTime struct { time.Time } const ctLayout = "2006/01/02|15:04:05" func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) { s := strings.Trim(string(b), "\"") if s == "null" { ct.Time = time.Time{} return } ct.Time, err = time.Parse(ctLayout, s) return } func (ct *CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil } var nilTime = (time.Time{}).UnixNano() func (ct *CustomTime) IsSet() bool { return !ct.IsZero() }
このカスタム タイプ内:
使用量
一度CustomTime 型が定義されており、カスタム時刻形式で JSON データを逆シリアル化するための構造体フィールドとして使用できます。
type Args struct { Time CustomTime } var data = ` { "Time": "2014/08/01|11:27:18" } ` func main() { a := Args{} fmt.Println(json.Unmarshal([]byte(data), &a)) fmt.Println(a.Time.String()) }
この例では、Time フィールドがカスタム「2006/01」にある JSON データを正常に逆シリアル化します。 /02|15:04:05」形式。
以上がGo で JSON 時間アンマーシャリングをカスタマイズして、RFC 3339 以外の形式を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。