Bagaimanakah anda menyahmarshal data JSON dengan teg medan tersuai dalam Go?

DDD
Lepaskan: 2024-10-30 01:31:29
asal
882 orang telah melayarinya

How do you unmarshal JSON data with custom field tags in Go?

Menyahmarshall JSON dengan Teg Medan Tersuai

Pengenalan

Bekerja dengan data JSON selalunya melibatkan penukarannya kepada struct untuk pemprosesan selanjutnya. Walau bagaimanapun, cabaran timbul apabila struct mengandungi medan dengan teg tersuai yang memberi kesan kepada proses unmarshalling. Artikel ini menunjukkan cara mengendalikan senario sedemikian menggunakan keupayaan pantulan Go.

Definisi Masalah

Dalam situasi khusus ini, matlamatnya adalah untuk menyahmarshal data JSON ke dalam struct di mana salah satu medannya mempunyai teg yang menunjukkan ia harus dianggap sebagai rentetan JSON. Mari kita pertimbangkan contoh ini:

<code class="go">const data = `{
    "I": 3,
    "S": {
        "phone": {
            "sales": "2223334444"
        }
    }
}`

type A struct {
    I int64
    S string `sql:"type:json"`
}</code>
Salin selepas log masuk

Dalam kes ini, matlamatnya ialah untuk menyahmarshal medan "S" dalam JSON sebagai rentetan ke dalam struct A.

Penyelesaian

Go menyediakan kaedah UnmarshalJSON terbina dalam yang membenarkan tingkah laku unmarshalling tersuai. Dengan mencipta jenis baharu, melaksanakan kaedah MarshalJSON dan UnmarshalJSON, kami boleh mencapai hasil yang diingini:

<code class="go">import (
    "encoding/json"
    "errors"
    "log"
    "fmt"
)

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

Dalam penyelesaian ini, jenis RawString melaksanakan kaedah MarshalJSON dan UnmarshalJSON untuk mengawal cara data JSON dikodkan dan dinyahkodkan, pada asasnya membenarkan medan "S" dianggap sebagai rentetan semasa unmarshalling.

Kesimpulan

Dengan memanfaatkan keupayaan refleksi Go dan kaedah unmarshalling tersuai, adalah mungkin untuk mengendalikan senario unmarshalling JSON yang kompleks walaupun apabila medan mempunyai teg khusus yang memerlukan rawatan khas.

Atas ialah kandungan terperinci Bagaimanakah anda menyahmarshal data JSON dengan teg medan tersuai 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!