Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan JSON Unmarshalling Apabila Data Mungkin Menjadi Array atau Objek?

Bagaimana Mengendalikan JSON Unmarshalling Apabila Data Mungkin Menjadi Array atau Objek?

Susan Sarandon
Lepaskan: 2024-12-13 19:00:13
asal
394 orang telah melayarinya

How to Handle JSON Unmarshalling When the Data Might Be an Array or an Object?

Cara Menyahmarshall JSON dengan Tatasusunan atau Objek

Apabila berurusan dengan JSON, mengendalikan senario di mana data yang dikembalikan mungkin merupakan tatasusunan atau objek boleh mencabar. Artikel ini menangani isu ini dan membentangkan penyelesaian yang melibatkan penggunaan json.Jenis RawMessage dan unmarshalling dinamik berdasarkan struktur JSON.

Menyingkap Struktur JSON Dinamik

Pertimbangkan jawapan JSON berikut:

{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
Salin selepas log masuk
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
Salin selepas log masuk

Seperti yang dilihat daripada jawapan, gwrcmd boleh menjadi objek atau tatasusunan. Untuk mengambil kira perkara ini, struct Go tersuai ditakrifkan sebagai:

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string
Salin selepas log masuk

Menyelesaikan Teka-teki Unmarshalling

Kunci untuk menyelesaikan isu ini terletak pada penggunaan json.RawMessage , yang menerima sebarang nilai JSON. Kami mencipta pembungkus dalam struct Respons untuk memegang JSON mentah:

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }
Salin selepas log masuk

Dynamic Unmarshaling Based on JSON Structure

Dalam kaedah UnmarshalJSON struct Response, kami memeriksa bait pertama RawAWrapper.RawA untuk menentukan sama ada ia mewakili tatasusunan atau objek. Bergantung pada keputusan, kami menyahmarshal data dengan sewajarnya:

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.RawAWrapper); err != nil {
        return err
    }
    if r.RawAWrapper.RawA[0] == '[' {
        return json.Unmarshal(r.RawAWrapper.RawA, &r.As)
    }
    return json.Unmarshal(r.RawAWrapper.RawA, &r.A)
}
Salin selepas log masuk

Pendekatan ini memberikan fleksibiliti dalam mengendalikan JSON dengan struktur berbeza tanpa memerlukan berbilang struktur.

Atas ialah kandungan terperinci Bagaimana Mengendalikan JSON Unmarshalling Apabila Data Mungkin Menjadi Array atau Objek?. 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