非 RFC 3339 時間形式のカスタム JSON アンマーシャリング
Go のエンコード/json パッケージは、以下の場合に RFC 3339 時間形式に厳密に準拠します。 JSON データのデシリアライズ。これは、この標準から逸脱する時刻形式を扱う場合に不便になる可能性があります。
解決策: カスタム マーシャラーとアンマーシャラーを実装します
既存の JSON データを変更したり、JSON データに依存したりする代わりに、中間の変換手順では、より適切な解決策は、カスタム インターフェイスに json.Marshaler インターフェイスと json.Unmarshaler インターフェイスを実装することです。 type.
次の例は、特定の非 RFC 3339 時間形式の逆シリアル化を処理するカスタム型 (CustomTime) を作成する方法を示しています。
import ( "fmt" "strconv" "strings" "time" "github.com/golang/protobuf/ptypes/timestamp" ) 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 Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} if err := json.Unmarshal([]byte(data), &a); err != nil { fmt.Println("Error unmarshaling: ", err) return } if !a.Time.IsSet() { fmt.Println("Time not set") } else { fmt.Println(a.Time.String()) } }
注: CustomTime.IsSet() メソッドは、Time フィールドがゼロでないかどうかをチェックし、時間値が実際に設定されているかどうかを判断する方法を提供します。
カスタムのマーシャラーとアンマーシャラーを実装すると、RFC 3339 標準から逸脱する可能性のある時刻形式を柔軟に処理できるようになり、Go でシームレスな JSON データの逆シリアル化が可能になります。
以上がGo で JSON をアンマーシャリングするときに、RFC 3339 以外の時刻形式を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。