再帰構造を使用した 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 サイトの他の関連記事を参照してください。