Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyahserialisasi Format Masa Bukan RFC 3339 dalam Go dengan `pengekodan/json`?

Bagaimana untuk Menyahserialisasi Format Masa Bukan RFC 3339 dalam Go dengan `pengekodan/json`?

Patricia Arquette
Lepaskan: 2024-12-18 20:57:10
asal
713 orang telah melayarinya

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

Menyahsiri Format Masa Bukan RFC 3339 dalam Go dengan pengekodan/json

Apabila menggunakan pakej pengekodan/json dalam Go, tingkah laku lalai untuk menyahmarshaling nilai masa adalah untuk mematuhi format RFC 3339 dengan ketat. Walau bagaimanapun, bagaimana jika anda menemui format masa yang menyimpang daripada piawai ini?

Pelaksanaan Jenis Masa Tersuai

Untuk mengendalikan situasi sedemikian, anda boleh melaksanakan antara muka json.Marshaler dan json.Unmarshaler pada tersuai menaip. Ini membolehkan anda mentakrifkan logik pengekodan dan penyahkodan tersuai untuk format masa khusus anda.

Berikut ialah contoh jenis Masa Tersuai:

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()
}
Salin selepas log masuk

Penggunaan dalam Struktur

Untuk menggunakan jenis CustomTime, anda boleh membenamkannya sebagai medan dalam a struct:

type Args struct {
    Time CustomTime
}
Salin selepas log masuk

Contoh

Berikut ialah contoh cara menggunakan Args struct dan jenis CustomTime untuk menyahmarshal rentetan JSON yang mengandungi format masa bukan RFC 3339:

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())
}
Salin selepas log masuk

Output:

<nil>
2014-08-01 11:27:18 +0000 UTC
Salin selepas log masuk

Dengan melaksanakan jenis CustomTime tersuai, anda boleh mengendalikan penyahserialisasian format masa yang bukan dalam format RFC 3339.

Atas ialah kandungan terperinci Bagaimana untuk Menyahserialisasi Format Masa Bukan RFC 3339 dalam Go dengan `pengekodan/json`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan