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
Susan Sarandonasal
2024-12-13 19:00:13398semak imbas

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"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"

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

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"`
    }

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)
}

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!

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