Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Berjaya Menyahmarshal Data JSON kepada Jenis Antara Muka dalam Go?

Bagaimanakah Saya Boleh Berjaya Menyahmarshal Data JSON kepada Jenis Antara Muka dalam Go?

Patricia Arquette
Patricia Arquetteasal
2025-01-02 20:51:38738semak imbas

How Can I Successfully Unmarshal JSON Data to Interface Types in Go?

Unmarshalling to Interface Types

Salah satu cabaran dalam pakej RPC dan JSON Go ialah unmarshalling kepada jenis antara muka. Mari kita rungkai isu ini dan teroka penyelesaiannya.

Masalahnya

Apabila cuba unmarshal kepada jenis antara muka, kita menghadapi ralat seperti "json: cannot unmarshal object into Go nilai jenis utama.Foo." Ini berlaku kerana pemantul tidak dapat menentukan jenis konkrit yang sesuai untuk dijadikan instantiat bagi data tersusun masuk.

Penyelesaian

Isu timbul daripada kekurangan maklumat jenis yang tersedia untuk pemantul semasa unmarshalling. Sebagai contoh, sementara marshalling boleh dilakukan daripada pembolehubah jenis antara muka, unmarshalling bukan disebabkan oleh ketidakupayaan reflektor untuk mengenal pasti jenis konkrit yang sepadan.

Untuk menyelesaikan masalah ini, rangka kerja seperti Java's Json (jackson) menggunakan anotasi untuk memberikan tambahan taip maklumat. Walau bagaimanapun, dalam Go, kami boleh melaksanakan antara muka Unmarshaler untuk jenis tersuai untuk mengendalikan proses unmarshaler sendiri.

Melaksanakan Unmarshaler

Berikut ialah contoh pelaksanaan antara muka Unmarshaler untuk RawString jenis tersuai kami:

type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
    *m += RawString(data)
    return nil
}

Sekarang, kita boleh unmarshal Data JSON ke dalam contoh RawString:

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}

Dengan menyediakan pelaksanaan Unmarshaler untuk jenis tersuai kami, kami boleh menyahmarshal data JSON tanpa menghadapi ralat yang disebutkan di atas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Berjaya Menyahmarshal Data JSON kepada Jenis Antara Muka dalam 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