Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Unmarshal JSON dengan Dynamic Keys in Go?

Bagaimana untuk Unmarshal JSON dengan Dynamic Keys in Go?

Mary-Kate Olsen
Lepaskan: 2024-12-01 19:25:20
asal
315 orang telah melayarinya

How to Unmarshal JSON with Dynamic Keys in Go?

Pengendalian Kunci Dinamik dalam Viper/JSON Unmarshaling

Apabila berurusan dengan data JSON yang menyimpang daripada format yang telah ditetapkan, unmarshaling dalam Go boleh menjadi mencabar . Pertimbangkan fail konfigurasi JSON dengan kekunci dinamik, seperti yang berikut:

{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}
Salin selepas log masuk

Untuk menyahmarshal data ini ke dalam struct Go dengan kekunci dinamik, satu pendekatan ialah menggunakan peta:

type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}
Salin selepas log masuk

Dengan menggunakan map[string]Thing, struct yang terhasil boleh mengendalikan sebarang bilangan kekunci dinamik. Nyahmarshal data menggunakan:

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

Pendekatan ini membolehkan pembongkaran terus kekunci dinamik dalam JSON dan Viper (menggunakan viper.Get("things") untuk mendapatkan tatasusunan nilai Thing).

Walau bagaimanapun, jika kunci itu sendiri mestilah ahli struct, gelung pasca unmarshalling boleh digunakan untuk mengemas kini medan:

type Thing struct {
    Name string `json:"-"` // add the field
    Key1 string
    Key2 string
}

// Fix the name field after unmarshal
for k, t := range x.Things {
    t.Name = k
    x.Things[k] = t
}
Salin selepas log masuk

Ini membenarkan kunci untuk dimasukkan ke dalam struct sambil mengekalkan sifat dinamik asal data JSON.

Atas ialah kandungan terperinci Bagaimana untuk Unmarshal JSON dengan Dynamic Keys in Go?. 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