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

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

Patricia Arquette
リリース: 2025-01-01 09:28:11
オリジナル
852 人が閲覧しました

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

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:

  • UnmarshalJSON は、非 RFC 3339 時刻形式の CustomTime 型への逆シリアル化を処理します。
  • MarshalJSON は、CustomTime 値のカスタム形式へのシリアル化を処理します。
  • IsSet CustomTime が実際に設定されたかどうかを確認する方法を提供します。 set.

使用法

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

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