Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Tatasusunan?

Bagaimana untuk Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Tatasusunan?

Barbara Streisand
Lepaskan: 2024-12-05 03:51:13
asal
210 orang telah melayarinya

How to Handle Inconsistent JSON Fields: Strings vs. Arrays?

Mengendalikan Medan JSON yang Tidak Konsisten: Kes Rentetan vs. Tatasusunan

Apabila berurusan dengan data JSON yang tidak konsisten sepenuhnya, cabaran mungkin timbul dalam proses unmarshalling. Ini boleh berlaku apabila medan tertentu dalam JSON berbeza dalam formatnya, menimbulkan kesukaran untuk proses unmarshalling.

Masalahnya:

Pertimbangkan senario berikut:

type MyListItem struct {
    Date  string `json:"date"`
    DisplayName       string `json:"display_name"`
}

type MyListings struct {
    CLItems []MyListItem `json:"myitems"`
}
Salin selepas log masuk

Data JSON mempunyai medan yang dipanggil "display_name", yang dijangkakan sebagai rentetan. Walau bagaimanapun, dalam beberapa kes, ia juga boleh menjadi tatasusunan rentetan. Ketidakkonsistenan ini merumitkan proses unmarshalling, yang membawa kepada ralat.

Penyelesaian:

Untuk mengatasi cabaran ini, kita boleh memanfaatkan dua teknik:

  1. Menggunakan json.RawMessage: Tangkap medan bermasalah sebagai json.RawMessage type.
  2. Menggunakan JSON "-" Name: Takrifkan medan "DisplayName" sebagai "-" dalam penyahkod JSON untuk mengecualikannya daripada proses unmarshalling.

Dikemas kini Kod:

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

Menyahmarshall JSON:

Menyahmarshall JSON peringkat atas:

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

Mengekstrak "DisplayName " medan bergantung padanya jenis:

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

Contoh:

var listings MyListings
if err := json.Unmarshal([]byte(data), &listings); err != nil {
    // handle error
}
for i := range listings.CLItems {
    li := &listings.CLItems[i]
    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

Dengan menggunakan teknik ini, anda boleh mengendalikan medan JSON yang tidak konsisten dengan berkesan, memastikan pengekstrakan dan manipulasi data yang betul dalam aplikasi anda .

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Tatasusunan?. 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