Bagaimana untuk Membongkar Data JSON Bersarang Tanpa Mengetahui Strukturnya?

Mary-Kate Olsen
Lepaskan: 2024-11-02 22:15:29
asal
712 orang telah melayarinya

How to Unmarshal Nested JSON Data Without Knowing Its Structure?

Menyahmarshaling Nested JSON Tanpa Pengetahuan Struktur

Pernyataan Masalah

Apabila berurusan dengan data JSON bersarang , mungkin mencabar untuk menentukan struct yang sesuai untuk dibongkar. Ini adalah benar terutamanya untuk data yang disimpan dalam stor nilai kunci, di mana struktur data JSON boleh berbeza-beza secara meluas.

Soalan 1: Mengelakkan Unmarshaling Berulang

Sementara unmarshaling berulang mungkin memerlukan beberapa overhed prestasi, ia tidak semestinya sesuatu yang perlu dielakkan melainkan ia menjadi halangan yang ketara.

Soalan 2: Menentukan Jenis Struktur

Terdapat dua kaedah utama untuk menentukan jenis struct:

Kaedah 1: Nyahmarshaling ke Antara Muka

  1. Nyahmarshal json.RawMessage ke peta[rentetan]antaramuka{} menggunakan json.Unmarshal(*objmap["foo"], &myMap).
  2. Semak jenis data JSON bersarang dalam myMap. Ia akan mendedahkan jenis data sebenar (cth., Baz, Bar).

Kaedah 2: Menggunakan Ungkapan Biasa

  1. Buat biasa ungkapan untuk mengekstrak medan jenis daripada data JSON bersarang.
  2. Gunakan fungsi regexp.FindString untuk mengekstrak jenis.

Setelah jenis struct ditentukan, anda boleh menyahmarshal data:

varbazorbar interface{}
if err := json.Unmarshal(*objmap["foo"], &bazorbar); err !=nil{
   return err
}

switch v := bazorbar.(type) {
case map[string]*json.RawMessage:
   // If the data is a nested JSON object, further unmarshaling is needed.
   result, err := unmarshalNested(v["nested_data"])
   if err != nil
      return err
   foo.Nested_Data = result
case []interface{}:
   // If the data is an array of JSON objects, process each element.
   for _, item := range v {
      result, err := unmarshalNested(item.(map[string]interface{}))
      if err != nil
         return err
      foo.Nested_Array = append(foo.Nested_Array, result)
   }
}
Salin selepas log masuk

Contoh Kod:

// Unmarshals nested JSON data.
func unmarshalNested(data map[string]interface{}) (interface{}, error) {
   type_expr := regexp.MustCompile(`"type":\s*"([a-zA-Z]+)"`)
   matches := type_expr.FindStringSubmatch(data["foo"].(string))

   if len(matches) == 2 {
      switch matches[1] {
         case "Baz":
            var baz Baz
            if err := json.Unmarshal([]byte(data["foo"].(string)), &baz); err != nil {
               return nil, err
            }
            return baz, nil
         case "Bar":
            var bar Bar
            if err := json.Unmarshal([]byte(data["foo"].(string)), &bar); err != nil {
               return nil, err
            }
            return bar, nil
      }
   }
   return nil, errors.New("cannot determine type")
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Membongkar Data JSON Bersarang Tanpa Mengetahui Strukturnya?. 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