Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Berjaya Menyahmarshal Nested JSON dengan Kunci Dinamik dalam Go?

Bagaimanakah Saya Boleh Berjaya Menyahmarshal Nested JSON dengan Kunci Dinamik dalam Go?

Barbara Streisand
Lepaskan: 2024-12-18 09:42:22
asal
348 orang telah melayarinya

How Can I Successfully Unmarshal Nested JSON with Dynamic Keys in Go?

Merungkai JSON dengan Struktur Rekursif

Pertimbangkan rentetan JSON berikut yang mewakili konfigurasi untuk MongoDB:

[{
    "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": ""
                }
            }
        ]
    }
}]
Salin selepas log masuk

Kami mempunyai struct, DBS, yang memodelkan 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`
}
Salin selepas log masuk

Walau bagaimanapun, kami menghadapi masalah apabila menyahmarshal JSON menggunakan json.Unmarshal. Selepas proses itu, kepingan DBS kami kekal kosong.

Masalah asas ialah input JSON kami mempunyai objek JSON tambahan yang membungkus nilai DBS kami dan nilai DBS kami ialah sifat objek "db". Selain itu, tatasusunan "replika" mengandungi objek dengan kekunci yang berbeza-beza yang boleh diwakili oleh DBS.

Untuk memodelkan JSON ini dengan tepat, kami memerlukan jenis "dinamik". Peta berfungsi sebagai pilihan yang sesuai. Oleh itu, struktur yang sesuai untuk JSON kami ialah []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"`
}
Salin selepas log masuk

Struktur alternatif ini menghuraikan input JSON dengan berkesan:

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
Salin selepas log masuk

Output mewakili struktur JSON dengan tepat.

Selain itu, kita boleh mengoptimumkan model dengan menggunakan penunjuk dan memodelkan tahap pertama, yang sentiasa "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"`
}
Salin selepas log masuk

Model yang dikemas kini ini menyediakan perwakilan konfigurasi JSON yang lebih ringkas dan cekap.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Berjaya Menyahmarshal Nested JSON dengan Kunci Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan