Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menyahmarshal Inconsistent String atau Array Medan JSON dengan Cekap?

Bagaimanakah Saya Boleh Menyahmarshal Inconsistent String atau Array Medan JSON dengan Cekap?

Mary-Kate Olsen
Lepaskan: 2024-12-05 14:53:14
asal
453 orang telah melayarinya

How Can I Efficiently Unmarshal Inconsistent String or Array JSON Fields?

Menyahmarshalling Medan JSON Fleksibel: Menukar Nilai Rentetan atau Tatasusunan Tidak Konsisten

Masalah

Menyahmarshalling JSON boleh mencabar apabila medan boleh tidak konsisten, muncul sebagai sama ada rentetan atau tatasusunan rentetan. Ketidakkonsistenan ini boleh membawa kepada ralat unmarshalling, menyebabkan aplikasi anda gagal.

Penyelesaian

Gunakan Raw JSON Data Capture

Gunakan data json.RawMessage struktur untuk menangkap medan JSON yang berbeza-beza sebagai data mentah. Selain itu, manfaatkan tag nama json "-" untuk menyembunyikan medan semasa fasa penyahkodan awal.

type MyListItem struct {
    Date           string          `json:"date"`
    RawDisplayName json.RawMessage `json:"display_name"`
    DisplayName    []string        `json:"-"`
}
Salin selepas log masuk

Unmarshal Top-Level JSON

Nyahmarshal top- tahap struktur JSON tanpa mengisi DisplayName medan.

var li MyListItem
if err := json.Unmarshal(data, &li); err != nil {
    // handle error
}
Salin selepas log masuk

Parse Raw Display Name

Bergantung pada jenis data mentah, nyahmarshall nama paparan ke dalam format yang sesuai.

if len(li.RawDisplayName) > 0 {
    switch li.RawDisplayName[0] {
    case '"':
        if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil {
            // handle error
        }
    case '[':
        var s []string
        if err := json.Unmarshal(li.RawDisplayName, &s); err != nil {
            // handle error
        }
        // Join arrays with "&&"
        li.DisplayName = strings.Join(s, "&&")
    }
}
Salin selepas log masuk

Kendalikan Tatasusunan Penyenaraian

Sepadukan logik yang disebut di atas ke dalam gelung untuk mengendalikan tatasusunan objek MyListItem dalam struktur MyListings.

var listings MyListings
if err := json.Unmarshal([]byte(data), &listings); err != nil {
    // handle error
}
for i := range listings.CLItems {
    li := &listings.CLItems[i]
    // Parse raw display name
    if len(li.RawDisplayName) > 0 {
        switch li.RawDisplayName[0] {
        case '"':
            if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil {
                // handle error
            }
        case '[':
            var s []string
            if err := json.Unmarshal(li.RawDisplayName, &s); err != nil {
                // handle error
            }
            li.DisplayName = strings.Join(s, "&&")
        }
    }
}
Salin selepas log masuk

Encapsulate Logic

Untuk kejadian berulang medan dengan pelbagai jenis, pertimbangkan merangkum logik penghuraian dalam jenis tersuai yang melaksanakan json.Unmarshaler antara muka.

Kendalikan Nilai Tatasusunan

Untuk mengekalkan nilai medan sebagai kepingan rentetan dan bukannya rentetan bercantum, ubah suai jenis multiString dengan sewajarnya.

Teknik ini menyediakan kaedah yang mantap untuk mengendalikan medan JSON yang tidak konsisten, memastikan data unmarshalling berjaya dan tepat mendapatkan semula.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyahmarshal Inconsistent String atau Array Medan JSON dengan Cekap?. 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