Bagaimana untuk Menyahmarshal JSON ke dalam Struct dengan Medan yang Ditandakan dengan \'json\'?

Linda Hamilton
Lepaskan: 2024-11-02 00:02:02
asal
176 orang telah melayarinya

How to Unmarshal JSON into a Struct with a Field Tagged with

Menyahmarshall JSON ke dalam Struct dengan Medan Ditandakan dengan "json"

Apabila cuba menyahmarshal JSON ke dalam struct, anda mungkin menghadapi senario di mana medan tertentu mempunyai teg "json". Teg ini memerlukan pengendalian khas untuk memastikan data JSON ditukar dengan betul kepada format rentetan yang diingini dalam struct.

Dalam contoh yang disediakan, struct A mempunyai medan S yang ditandakan dengan sql:"type:json". Matlamatnya adalah untuk menyahmarshal nilai "S" dalam data JSON yang disediakan ke dalam format rentetan dalam struct A.

Pada mulanya, anda mungkin telah mempertimbangkan untuk menggunakan refleksi untuk menyemak sama ada teg medan mengandungi rentetan "json " dan kemudian nyahmarshal data JSON ke dalam medan itu sebagai rentetan. Walau bagaimanapun, pendekatan yang lebih cekap dan elegan ialah menggunakan ciri perpustakaan standard Go.

Menggunakan Jenis Tersuai dan Kaedah Marshal/Unmarshal

Salah satu cara untuk mencapai ini ialah dengan mentakrifkan RawString jenis tersuai dan melaksanakan Kaedah MarshalJSON dan UnmarshalJSON untuknya. Kaedah ini menyediakan cara untuk mengawal cara data JSON dikodkan dan dinyahkodkan, masing-masing.

Dalam contoh ini, jenis RawString membungkus nilai rentetan. Kaedah MarshalJSON mengembalikan nilai rentetan sebagai kepingan bait, manakala kaedah UnmarshalJSON menambahkan data yang diterima pada RawString sedia ada.

Marshaling dan Unmarshaling JSON

Langkah seterusnya ialah mentakrifkan A struct, yang merangkumi medan I (integer 64-bit) dan medan S jenis RawString.

Menggunakan jenis dan kaedah tersuai ini, anda boleh menyahmarshal data JSON yang disediakan ke dalam struct A. Kod Go berikut menunjukkan perkara ini:

<code class="go">import (
    "encoding/json"
    "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)
}</code>
Salin selepas log masuk

Dengan menggunakan pendekatan ini, anda boleh menyahmarshal data JSON ke dalam struct dengan medan yang ditandakan dengan "json" dan mengekalkan format rentetan asalnya.

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal JSON ke dalam Struct dengan Medan yang Ditandakan dengan \'json\'?. 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
Artikel terbaru oleh pengarang
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!