Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya Boleh Menyahmarshal Data JSON ke dalam Jenis Antara Muka dalam Go?

Bagaimanakah saya Boleh Menyahmarshal Data JSON ke dalam Jenis Antara Muka dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-20 09:22:11623semak imbas

How Can I Unmarshal JSON Data into an Interface Type in Go?

Unmarshal to an Interface Type

Dalam RPC, marshalling kepada jenis antara muka adalah mudah kerana objek adalah setempat dan reflektor boleh mengenal pasti jenis asasnya. Walau bagaimanapun, unmarshalling kepada jenis antara muka memberikan cabaran.

Reflektor tidak boleh menentukan jenis konkrit untuk diberikan kepada tika baharu yang akan menerima data tersusun. Had ini terpakai pada semua operasi marshalling/unmarshalling.

Untuk menyelesaikan isu ini dalam beberapa rangka kerja, maklumat tambahan disediakan untuk membantu reflektor. Contohnya, dalam Java Json(jackson), anotasi JsonTypeInfo menentukan jenis kelas.

Dalam Go, melaksanakan antara muka Unmarshaler untuk jenis tersuai anda boleh menangani cabaran ini. Pertimbangkan contoh berikut:

import (
    "encoding/json"
    "errors"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

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

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

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

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Menyahmarshal Data JSON ke dalam 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