Maison > développement back-end > Golang > Comment puis-je réussir à désorganiser le JSON imbriqué avec des clés dynamiques dans Go ?

Comment puis-je réussir à désorganiser le JSON imbriqué avec des clés dynamiques dans Go ?

Barbara Streisand
Libérer: 2024-12-18 09:42:22
original
345 Les gens l'ont consulté

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

Unmarshalling JSON avec des structures récursives

Considérez la chaîne JSON suivante représentant une configuration pour 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": ""
                }
            }
        ]
    }
}]
Copier après la connexion

Nous avoir une structure, DBS, qui modélise le 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`
}
Copier après la connexion

Cependant, nous rencontrons un problème lors de la désorganisation du JSON à l'aide de json.Unmarshal. Après le processus, notre tranche DBS reste vide.

Le problème sous-jacent est que notre entrée JSON a un objet JSON supplémentaire enveloppant nos valeurs DBS, et nos valeurs DBS sont des propriétés de l'objet "db". De plus, le tableau "replicas" contient des objets avec différentes clés qui peuvent être représentées par DBS.

Pour modéliser avec précision ce JSON, nous avons besoin d'un type "dynamique". Une carte constitue une option appropriée. Par conséquent, la structure appropriée pour notre JSON est []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"`
}
Copier après la connexion

Cette structure alternative analyse efficacement l'entrée JSON :

// ...

if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}
fmt.Printf("%+v", dbs)
Copier après la connexion

La sortie représente la structure JSON avec précision.

De plus, nous pouvons optimiser le modèle en utilisant des pointeurs et en modélisant le premier niveau, qui est toujours "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"`
}
Copier après la connexion

Ce modèle mis à jour fournit une représentation plus concise et efficace de la configuration JSON.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal