ホームページ > バックエンド開発 > Golang > Go で動的キーを使用してネストされた JSON を正常にアンマーシャルするにはどうすればよいですか?

Go で動的キーを使用してネストされた JSON を正常にアンマーシャルするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-18 09:42:22
オリジナル
345 人が閲覧しました

How Can I Successfully Unmarshal Nested JSON with Dynamic Keys in Go?

再帰構造を使用した JSON のアンマーシャリング

MongoDB の構成を表す次の JSON 文字列について考えてみましょう。

[{
    "db": {
        "url": "mongodb://localhost",
        "port": "27000",
        "uname": "",
        "pass": "",
        "authdb": "",
        "replicas": [
            {
                "rs01": {
                    "url":"mongodb://localhost",
                    "port": "27001",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            },
            {
                "rs02": {
                    "url":"mongodb://localhost",
                    "port": "27002",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            }
        ]
    }
}]
ログイン後にコピー

Weをモデル化する構造体 DBS があります。 JSON:

type DBS struct {
    URL      string `json:url`
    Port     string `json:port`
    Uname    string `json:uname`
    Pass     string `json:pass`
    Authdb   string `json:authdb`
    Replicas []DBS   `json:replicas`
}
ログイン後にコピー

ただし、json.Unmarshal を使用して JSON をアンマーシャリングするときに問題が発生します。プロセス後、DBS スライスは空のままです。

根本的な問題は、JSON 入力に DBS 値をラップする追加の JSON オブジェクトがあり、DBS 値が「db」オブジェクトのプロパティであることです。さらに、「レプリカ」配列には、DBS で表現できるさまざまなキーを持つオブジェクトが含まれています。

この JSON を正確にモデル化するには、「動的」型が必要です。地図は適切なオプションとして機能します。したがって、JSON に適切な構造は []map[string]DBS です。

type DBS struct {
    URL      string           `json:"url"`
    Port     string           `json:"port"`
    Uname    string           `json:"uname"`
    Pass     string           `json:"pass"`
    Authdb   string           `json:"authdb"`
    Replicas []map[string]DBS `json:"replicas"`
}
ログイン後にコピー

この代替構造は、JSON 入力を効果的に解析します。

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
ログイン後にコピー

出力は JSON 構造を表します。

さらに、ポインターを使用し、最初のレベルをモデル化することでモデルを最適化できます。 "db":

type DBReplicated struct {
    DB *DBS `json:"db"`
}

type DBS struct {
    URL      string            `json:"url"`
    Port     string            `json:"port"`
    Uname    string            `json:"uname"`
    Pass     string            `json:"pass"`
    Authdb   string            `json:"authdb"`
    Replicas []map[string]*DBS `json:"replicas"`
}
ログイン後にコピー

この更新されたモデルは、JSON 構成をより簡潔かつ効率的に表現します。

以上がGo で動的キーを使用してネストされた JSON を正常にアンマーシャルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート