自己参照構造要素を使用した JSON のアンマーシャリング
ネストされた構造を持つ次の 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": "" } } ] } }]
この JSON を Go 構造体で表現するには、次のように定義します。 struct:
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 入力がDBS 構造体のスライス。代わりに、別の JSON オブジェクト ラッパーが含まれており、DBS の値は「db」プロパティに属します。さらに、「レプリカ」プロパティには、さまざまなキーを保持するオブジェクトを含む JSON 配列が含まれており、これは DBS 構造体でも表すことができます。
この JSON を完全にモデル化するには、マップなどの動的タイプが必要です。必要な型は []map[string]DBS で、マップのスライスを表します。マップ キーは任意のプロパティ名をモデル化でき、値は DBS 構造体によってモデル化された JSON オブジェクトです。
次の例は、この型を使用して JSON 入力を完全に解析する方法を示しています。
import ( "encoding/json" "fmt" ) 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"` } func main() { var dbs []map[string]DBS if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } fmt.Printf("%+v", dbs) }
出力:
[map[db:{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}] map[rs02:{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}]]}]]
最初のレベルは常に「db」であることに注意してください。これはさらにモデル化でき、切り替えることができます。
JSON 入力のネストと構造を理解することで、データを正確に表すカスタム構造体に効果的にアンマーシャリングできます。
以上がGo で複雑な自己参照 JSON をアンマーシャルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。