Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan Format Masa Bukan RFC 3339 Apabila Menyahmarshaling JSON dalam Go?

Bagaimana Mengendalikan Format Masa Bukan RFC 3339 Apabila Menyahmarshaling JSON dalam Go?

DDD
Lepaskan: 2024-12-30 22:02:11
asal
520 orang telah melayarinya

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

Penyingkiran JSON Tersuai untuk Format Masa Bukan RFC 3339

Pakej pengekodan/json dalam Go mematuhi format masa RFC 3339 dengan ketat apabila menyahsiri data JSON. Ini boleh menyusahkan apabila berurusan dengan format masa yang menyimpang daripada standard ini.

Penyelesaian: Melaksanakan Custom Marshalers and Unmarshalers

Daripada mengubah suai data JSON sedia ada atau bergantung pada langkah penukaran perantaraan, penyelesaian yang lebih sesuai adalah dengan melaksanakan antara muka json.Marshaler dan json.Unmarshaler pada jenis tersuai.

Contoh berikut menunjukkan cara mencipta jenis tersuai (CustomTime) yang mengendalikan penyahserikatan format masa bukan RFC 3339 tertentu:

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

Nota : Kaedah CustomTime.IsSet() menyemak sama ada medan Masa bukan sifar, menyediakan cara untuk menentukan sama ada nilai masa sebenarnya ditetapkan atau tidak.

Dengan melaksanakan Marshalers dan Unmarshalers tersuai, anda memperoleh fleksibiliti untuk mengendalikan format masa yang mungkin menyimpang daripada standard RFC 3339, membolehkan penyahserikatan data JSON yang lancar dalam Go.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Format Masa Bukan RFC 3339 Apabila Menyahmarshaling JSON dalam Go?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan