ホームページ > バックエンド開発 > Golang > Go で「encoding/json」を使用して非 RFC 3339 時刻形式を逆シリアル化する方法は?

Go で「encoding/json」を使用して非 RFC 3339 時刻形式を逆シリアル化する方法は?

Patricia Arquette
リリース: 2024-12-18 20:57:10
オリジナル
710 人が閲覧しました

How to Deserialize Non-RFC 3339 Time Formats in Go with `encoding/json`?

encoding/json を使用した Go での非 RFC 3339 時間形式のデシリアライズ

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

Struct での使用法

CustomTime タイプを使用するには、それをフィールドとして埋め込むことができます。 struct:

type Args struct {
    Time CustomTime
}
ログイン後にコピー

Example

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

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