Menyahmarshalling Data Arbitrary dengan JSON and Go
Anda mempunyai keperluan khusus: unmarshalling data JSON dengan cara yang membolehkan anda memprosesnya dalam bahagian atau bahagian. Untuk mencapai matlamat ini, anda membayangkan struktur di mana separuh pertama data, atau "kod," menunjukkan cara mentafsir separuh kedua. Dua struct berpotensi untuk separuh masa kedua ialah Julat dan Pengguna.
Cabaran
Pakej json sedia ada dalam Go menyediakan fungsi yang mudah untuk menyusun dan menyahmarshaling struct yang ditentukan, tetapi ia tidak memenuhi keperluan anda untuk data sewenang-wenangnya.
Menyahkod Penyelesaian
Penyelesaian melibatkan pengenalan medan json.RawMessage (Payload) dalam struct Mesej anda. Medan ini membolehkan anda menangguhkan menghuraikan data sehingga anda mengetahui kod yang dinyatakan pada separuh pertama.
Berikut ialah contoh pelaksanaan dalam Go:
<code class="go">type Message struct { Code int Payload json.RawMessage } type Range struct { Start int End int } type User struct { ID int Pass int } // Custom unmarshalling function func MyUnmarshall(m []byte) { var message Message json.Unmarshal(m, &message) var payload interface{} switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) }</code>
Penggunaan
Anda akan menggunakan penyelesaian ini dengan mengosongkan "separuh atas" terlebih dahulu menggunakan fungsi json.Unmarshal. Kemudian, berdasarkan kod yang diambil daripada "separuh atas," anda akan menyahmarshall "separuh bawah" menggunakan fungsi json.Unmarshal sekali lagi, kali ini menyediakan json.RawMessage sasaran objek.
Contoh
<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) // This will decode the data into a Range object</code>
Pertimbangan
Teknik ini membolehkan anda mengendalikan data sewenang-wenangnya unmarshalling dalam struktur dan cara yang fleksibel. Walau bagaimanapun, ia memperkenalkan kebergantungan masa jalan pada mengetahui kod terlebih dahulu dan kewujudan struct padanan untuk kod yang berbeza.
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshall Data JSON Arbitrari dalam Go dengan Skema Didorong Kod Dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!