ホームページ > バックエンド開発 > Golang > Go で JSON 時間アンマーシャリングをカスタマイズして、RFC 3339 以外の形式を処理するにはどうすればよいですか?

Go で JSON 時間アンマーシャリングをカスタマイズして、RFC 3339 以外の形式を処理するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-18 21:09:13
オリジナル
1006 人が閲覧しました

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

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()
}
ログイン後にコピー

このカスタム タイプ内:

  • UnmarshalJSON は、指定されたカスタムを使用して JSON 文字列を time.Time 値に変換しますlayout.
  • MarshalJSON は、同じカスタム レイアウトを使用して、time.Time 値を JSON 文字列に変換します。
  • IsSet は、CustomTime 値が設定されているかどうか (ゼロではない) を確認するためのオプションのメソッドです。

使用量

一度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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート