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

Bagaimana Mengendalikan Format Masa Bukan RFC 3339 dalam JSON Unmarshaling Go?

Patricia Arquette
Patricia Arquetteasal
2025-01-01 09:28:11855semak imbas

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

JSON Unmarshaling Format Masa Bukan RFC 3339 dalam Go

Gelagat lalai pakej pengekodan/json dalam Go adalah untuk mengawal dan nilai masa unmarshal dalam format RFC 3339. Walau bagaimanapun, bagaimana jika anda menemui data JSON dengan nilai masa dalam format yang berbeza?

Penyelesaian dengan Transformasi Manual

Satu pendekatan ialah menyahsiri nilai masa menjadi rentetan, mengubahnya secara manual menjadi format RFC 3339, dan kemudian gunakan json.Unmarshal sekali lagi. Semasa kaedah ini berfungsi, ia memperkenalkan overhed pemprosesan tambahan dan kod kekacauan.

Jenis Masa Tersuai

Penyelesaian yang lebih elegan adalah dengan melaksanakan json.Marshaler dan json.Unmarshaler antara muka pada jenis masa tersuai. Ini membenarkan pengendalian tersuai bagi siri dan penyahsirilan nilai masa.

Contoh Pelaksanaan

Berikut ialah contoh jenis masa tersuai bernama 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()
}

Dalam jenis masa tersuai ini:

  • Pengendalian UnmarshalJSON penyahserialisasian format masa bukan RFC 3339 ke dalam jenis CustomTime.
  • MarshalJSON mengendalikan siri nilai CustomTime ke dalam format tersuai.
  • IsSet menyediakan cara untuk menyemak sama ada CustomTime telah sebenarnya ditetapkan.

Penggunaan

Kini, anda boleh menggunakan jenis CustomTime dalam kod penyahserikatan JSON anda:

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())
}

Pendekatan ini membenarkan anda mengendalikan format masa bukan RFC 3339 dalam data JSON dengan elegan dan cekap tanpa menjejaskan fleksibiliti. Ia juga mempamerkan kuasa melaksanakan antara muka json.Marshaler dan json.Unmarshaler tersuai untuk mengendalikan pensirilan dan penyahsirilan jenis data.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Format Masa Bukan RFC 3339 dalam JSON Unmarshaling Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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