首頁 > 後端開發 > Golang > 在 Go 中解組 JSON 時如何處理非 RFC 3339 時間格式?

在 Go 中解組 JSON 時如何處理非 RFC 3339 時間格式?

DDD
發布: 2024-12-30 22:02:11
原創
520 人瀏覽過

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

非RFC 3339 時間格式的自訂JSON 解組

Go 中的encoding/json 包嚴格遵守RFC 3339 時間格式,當反序列化JSON 資料。在處理偏離此標準的時間格式時,這可能會很不方便。

解決方案:實作自訂編組器和解組器

而不是修改現有的JSON 資料或依賴中間轉換步驟,更合適的解決方案是在自訂上實作json.Marshaler 和json.Unmarshaler 介面

以下範例示範如何建立處理特定非RFC 3339時間格式的反序列化的自訂類型(CustomTime):

import (
    "fmt"
    "strconv"
    "strings"
    "time"

    "github.com/golang/protobuf/ptypes/timestamp"
)

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 Args struct {
    Time CustomTime
}

var data = `
    {"Time": "2014/08/01|11:27:18"}
`

func main() {
    a := Args{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        fmt.Println("Error unmarshaling: ", err)
        return
    }

    if !a.Time.IsSet() {
        fmt.Println("Time not set")
    } else {
        fmt.Println(a.Time.String())
    }
}
登入後複製

注意: CustomTime.IsSet() 方法檢查時間欄位是否不為零,提供了一種方法來確定時間值是否已實際設定或不是。

透過實作自訂編組器和解組器,您可以靈活地處理可能偏離 RFC 3339 標準的時間格式,從而在 Go 中實現無縫的 JSON 資料反序列化。

以上是在 Go 中解組 JSON 時如何處理非 RFC 3339 時間格式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板