Mengakses Kunci dan Nilai JSON Bersarang Dalam dalam Go
Pertimbangkan kod klien websocket berikut yang ditulis dalam Go:
import ( "encoding/json" "log" ) func main() { msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}` var u map[string]interface{} err := json.Unmarshal([]byte(msg), &u) if err != nil { log.Fatalf("Failed to unmarshal: %v\n", err) } args := u["args"] // Attempting to directly access the time key will throw an error log.Println(args[0]["time"]) // invalid notation }
Dalam senario ini, ralat "operasi tidak sah: args[0] (indeks antara muka jenis {})" timbul disebabkan oleh tatatanda yang tidak betul apabila mengakses kekunci "masa" bersarang dalam.
Penyelesaian
Penyelesaian yang disyorkan melibatkan penggunaan pakej github.com/bitly/go-simplejson, yang memudahkan navigasi struktur data JSON. Rujuk dokumentasi di http://godoc.org/github.com/bitly/go-simplejson untuk butiran.
Menggunakan pakej ini pada kod di atas:
// Import go-simplejson import "github.com/bitly/go-simplejson" func main() { // Create a JSON object json := simplejson.New() json.Decode([]byte(msg)) // Using go-simplejson, access the time key time, err := json.Get("args").GetIndex(0).String("time") if err != nil { log.Fatalf("Failed to get time: %v\n", err) } log.Println(time) // Returns the time value }
Mengenai bahagian kedua soalan asal, mengisytiharkan struct Go akan memerlukan pemasar tersuai dan unmarshaler, yang melibatkan pelaksanaan antara muka pengekodan.TextMarshaler dan pengekodan.TextUnmarshaler. Walau bagaimanapun, menggunakan pustaka JSON seperti go-simplejson memudahkan proses ini.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengakses kunci dan nilai JSON bersarang dalam dalam Go tanpa menggunakan pemasar tersuai dan penyahmarshaler?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!