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
Barbara Streisandasal
2024-12-05 03:51:13208semak imbas

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

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

Menyahmarshall JSON:

Menyahmarshall JSON peringkat atas:

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

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, "&&")
    }
}

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, "&&")
        }
    }
}

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!

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