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
Barbara Streisandoriginal
2024-12-18 09:42:22351parcourir

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": ""
                }
            }
        ]
    }
}]

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`
}

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"`
}

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

// ...

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

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"`
}

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!

Déclaration:
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