Go で深くネストされた JSON キーと値にアクセスする
Go で書かれた次の WebSocket クライアント コードを考えてみましょう:
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 }
このシナリオでは、深くネストされた「time」キーにアクセスする際の不適切な表記により、「無効な操作: args[0] (index of type Interface {})」というエラーが発生します。
解決策
推奨される解決策には、JSON データ構造のナビゲーションを簡素化する github.com/bitly/go-simplejson パッケージの利用が含まれます。詳細については、http://godoc.org/github.com/bitly/go-simplejson のドキュメントを参照してください。
このパッケージを上記のコードに適用する:
// 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 }
元の質問の 2 番目の部分では、Go 構造体を宣言するにはカスタム マーシャラーとアンマーシャラーが必要になります。これには、encoding.TextMarshaler インターフェイスと encoding.TextUnmarshaler インターフェイスの実装が含まれます。ただし、 go-simplejson のような JSON ライブラリを使用すると、このプロセスが簡素化されます。
以上がカスタム マーシャラーとアンマーシャラーを使用せずに、Go で深くネストされた JSON キーと値にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。