ホームページ >バックエンド開発 >Golang >Go JSON アンマーシャリングで非 RFC 3339 時刻形式を処理するにはどうすればよいですか?

Go JSON アンマーシャリングで非 RFC 3339 時刻形式を処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 00:22:09992ブラウズ

How to Handle Non-RFC 3339 Time Formats in Go JSON Unmarshaling?

Go JSON での非 RFC 3339 時間形式のカスタム アンマーシャリング

Go では、エンコーディング/json パッケージは次の場合に RFC 3339 に厳密に準拠します。時間値を逆シリアル化します。ただし、データが異なる時間形式で受信される場合もよくあります。面倒な変換を避けたい場合、これは問題になる可能性があります。

カスタム タイプの使用

これに対処するには、json.Marshaler インターフェイスと json.Unmarshaler インターフェイスを実装できます。カスタムタイプで。これにより、型を JSON との間でマーシャリングおよびアンマーシャリングする方法を定義できます。

たとえば、次の 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()
}

Inこのタイプ:

  • UnmarshalJSON メソッドはカスタム形式から時間値を解析します("2006/01/02|15:04:05")。
  • MarshalJSON メソッドは、同じカスタム形式で時刻値を出力します。
  • IsSet メソッドは、時刻値が次の形式であるかどうかを確認します。 set (ゼロ以外).

JSON 構造体で CustomTime 型を使用すると、次のことができます。非 RFC 3339 形式からの時刻値の逆シリアル化を処理します:

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())
}

この例では、Args 構造体は Time フィールドに CustomTime 型を使用します。 RFC 3339 以外の時刻形式で JSON データを逆シリアル化する場合、CustomTime 型は変換を正しく処理します。

以上がGo JSON アンマーシャリングで非 RFC 3339 時刻形式を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。