入れ子と構造的類似性による JSON のアンマーシャリング
複雑な JSON 構造を扱う場合、構造体の 1 つの要素が構造体自体と同じ型です。これにより、アンマーシャリング プロセス中に問題が発生する可能性があります。
この特定のケースでは、データベース構成の配列を表す JSON 文字列が与えられます。各データベース構成には、レプリカのリストを含むさまざまな属性が含まれています。各レプリカは、データベース構成と同様の属性を持つ JSON オブジェクトでもあります。
この JSON 文字列をアンマーシャリングするには、ネストと構造の類似性に対応できるデータ構造が必要です。
動的タイプを使用したネストされた構造のモデル化
JSON 入力は DBS のスライスではないため構造体を使用する場合、その構造をキャプチャするには、より柔軟なデータ型が必要です。 Map[string]interface{} は、キーと値のペアを動的な値で表現できるため、優れたオプションです。
例:
type DBS struct { URL string Port string Uname string Pass string Authdb string Replicas []DBS } func main() { raw, err := ioutil.ReadFile("./config.json") if err != nil { fmt.Println(err.Error()) os.Exit(1) } var config []map[string]interface{} json.Unmarshal(raw, &config) for _, db := range config { d, ok := db["db"] if !ok { // Handle the case where "db" is missing } db := d.(map[string]interface{}) url := db["url"].(string) port := db["port"].(string) var replicas []DBS for _, replica := range db["replicas"] { replicas = append(replicas, mapToDBS(replica)) } // ... Other operations } }
動的タイプを使用した JSON の解析
この例では、 config 変数はマップのスライスであり、データベース構成をキーと値のペアとして保持できます。
データベース構成ごとに、"db" サブオブジェクトを作成し、それを map[string]interface{} にキャストします。これにより、"url" や "port" などの個々の属性にアクセスできるようになります。
"replicas" 属性も同様に処理されます。各レプリカは JSON オブジェクトであるため、mapToDBS() 関数を使用して DBS 構造体に変換できます。
動的型の柔軟性を活用することで、 JSON 文字列を効果的にアンマーシャリングし、そのネストされた構造を解析できます。以上がGo で構造的に類似した要素を持つネストされた JSON をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。