Go で encoding/json パッケージを使用する場合、時間値のアンマーシャリングのデフォルトの動作は次のとおりです。 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 タイプを使用するには、それをフィールドとして埋め込むことができます。 struct:
type Args struct { Time CustomTime }
次に、Args struct と CustomTime 型を使用して、非 RFC 3339 時刻形式を含む JSON 文字列をアンマーシャリングする方法の例を示します。
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()) }
出力:
<nil> 2014-08-01 11:27:18 +0000 UTC
カスタムを実装することによりCustomTime タイプを使用すると、RFC 3339 形式ではない時刻形式の逆シリアル化を処理できます。
以上がGo で「encoding/json」を使用して非 RFC 3339 時刻形式を逆シリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。