Go での非 RFC 3339 時間形式の JSON アンマーシャリング
Go のエンコーディング/json パッケージのデフォルトの動作は、マーシャリングとRFC 3339 形式のアンマーシャル時間値。しかし、異なる形式の時間値を含む JSON データが見つかった場合はどうすればよいでしょうか?
手動変換による解決策
1 つの方法は、時間値を文字列に逆シリアル化することです。手動で RFC 3339 形式に変換し、json.Unmarshal を再度適用します。この方法は機能しますが、追加の処理オーバーヘッドが発生し、コードが乱雑になります。
カスタム時間タイプ
より洗練された解決策は、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() }
この特別な時間の中でtype:
使用法
これで、JSON 逆シリアル化コードで CustomTime 型を使用できるようになります。
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()) }
このアプローチにより、次のことが可能になります。柔軟性を損なうことなく、JSON データ内の非 RFC 3339 時刻形式をエレガントかつ効率的に処理できます。また、データ型のシリアル化と逆シリアル化を処理するためのカスタム json.Marshaler インターフェイスと json.Unmarshaler インターフェイスの実装の力も紹介します。
以上がGo の JSON アンマーシャリングで非 RFC 3339 時刻形式を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。