ホームページ > バックエンド開発 > Golang > Go で複雑な自己参照 JSON をアンマーシャルするにはどうすればよいですか?

Go で複雑な自己参照 JSON をアンマーシャルするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-16 09:29:09
オリジナル
481 人が閲覧しました

How to Unmarshal Complex, Self-Referential JSON in Go?

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

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