Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menyahmarshal Data JSON Bukan Homogen dengan Medan \"Kod\"?
Menyahmarshalling Non-Homogenous Data JSON
Siasatan ini berpusat di sekitar unmarshalling data JSON dengan cekap dengan memanfaatkan mekanisme yang membolehkan untuk terpilih selektif unmarshalling bahagian tertentu atau segmen. Objektifnya adalah untuk mengendalikan struktur JSON di mana bahagian pertama berfungsi sebagai "kod" yang menentukan jenis data yang terkandung dalam bahagian terakhir.
Bayangkan senario di mana anda mempunyai berbilang struktur data:
<code class="go">type Range struct { Start int End int } type User struct { ID int Pass int }</code>
Dan mesej JSON anda mempunyai medan "kod" yang menandakan data yang ada dalam medan "muatan":
<code class="json">{ "Code": 4, "Payload": { "Start": 1, "End": 10 } } { "Code": 3, "Payload": { "ID": 1, "Pass": 1234 } }</code>
Anda perlu menyahmarshal medan "muatan" ke dalam struktur data yang sesuai berdasarkan pada medan "kod".
Penyelesaian
Kunci di sini ialah menggunakan jenis json.RawMessage untuk menangguhkan penyahmarshalan medan "muatan" sehingga selepas anda tahu jenisnya. Contohnya:
<code class="go">package main import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // Delay parsing until we know the code } // Unmarshall into appropriate structures based on Code func unmarshal(m []byte) error { var message Message err := json.Unmarshal(m, &message) if err != nil { return err } switch message.Code { case 3: var user User if err := json.Unmarshal(message.Payload, &user); err != nil { return err } fmt.Printf("Unmarshalled a User: %#v\n", user) case 4: var range Range if err := json.Unmarshal(message.Payload, &range); err != nil { return err } fmt.Printf("Unmarshalled a Range: %#v\n", range) default: return fmt.Errorf("unknown code: %d", message.Code) } return nil } func main() { json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`) if err := unmarshal(json1); err != nil { fmt.Printf("error: %v\n", err) } json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) if err := unmarshal(json2); err != nil { fmt.Printf("error: %v\n", err) } }</code>
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Data JSON Bukan Homogen dengan Medan \"Kod\"?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!