Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membongkar Data JSON Bersarang Tanpa Mengetahui Strukturnya?

Bagaimana untuk Membongkar Data JSON Bersarang Tanpa Mengetahui Strukturnya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 22:15:29724semak imbas

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

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

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!

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