ホームページ  >  記事  >  バックエンド開発  >  カスタム マーシャラーとアンマーシャラーを使用せずに、Go で深くネストされた JSON キーと値にアクセスするにはどうすればよいですか?

カスタム マーシャラーとアンマーシャラーを使用せずに、Go で深くネストされた JSON キーと値にアクセスするにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-26 19:41:02412ブラウズ

How can I access deeply nested JSON keys and values in Go without using custom marshalers and unmarshalers?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。