複雑な関係を持つネストされた JSON 構造を解明する
JSON データを扱うとき、構造体の 1 つの要素自体が構造体。このような複雑な構造を解明するには、JSON 解析と効率的なデータ モデリングを理解する必要があります。
課題: 自己参照要素を使用した JSON の解析
次の JSON 文字列を考えてみましょう。 「db」オブジェクトには、「db」をミラーリングするネストされた「レプリカ」が含まれています構造体:
[{ "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": "" } } ] } }]
および対応する構造体定義:
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 文字列をアンマーシャルしようとしていますjson.Unmarshal 関数を使用して DBS のスライスにコピーすると、空の結果になります。スライス:
func loadConfigs() []DBS { var config []DBS raw, err := ioutil.ReadFile("./config.json") if err != nil { fmt.Println(err.Error()) os.Exit(1) } json.Unmarshal(raw, &config) return config }
これは、JSON データが構造体の定義と一致しないために発生します。外側の JSON 配列ラッパーとレプリカ内のネストされた「db」オブジェクトは、構造体で明示的に表現されません。
解決策: 動的 JSON 構造のモデリング
正確に表現するにはJSON 構造では、さまざまなキーと値に対応できる動的タイプが必要です。 Map[string]DBS はこの動的な動作をモデル化できます。キーはプロパティ名を表し、値は 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"` }
モデルの洗練: ポインターの使用
出力を簡素化し、パフォーマンスを向上させるために、次に示すように、レプリカ マップで DBS タイプのポインターを使用できます。以下:
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 構造の複雑さを理解し、適切なデータ モデリング手法を利用することで、開発者は Golang で複雑なデータを効果的に解析して操作できるようになります。これにより、効率的なデータ操作と階層データ構造の正確な表現が可能になります。
以上がGo で自己参照要素を含むネストされた JSON 構造を効果的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。