Maison > développement back-end > Golang > Comment désorganiser JSON avec des paires clé/valeur arbitraires dans une structure en Go ?

Comment désorganiser JSON avec des paires clé/valeur arbitraires dans une structure en Go ?

DDD
Libérer: 2024-10-26 16:35:30
original
861 Les gens l'ont consulté

How to Unmarshal JSON with Arbitrary Key/Value Pairs into a Struct in Go?

Désassembler JSON avec des paires clé/valeur arbitraires à structurer

De nombreuses questions similaires ont été posées concernant la désorganisation de JSON avec des paires clé/valeur inconnues/arbitraires dans une structure. Cependant, aucune des solutions trouvées ne fournissait une méthode simple et élégante pour y parvenir.

Énoncé du problème

Nous avons une chaîne JSON contenant des champs connus (toujours présents) et un nombre inconnu d'inconnus/ champs arbitraires. Exemple :

<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>
Copier après la connexion

Dans cet exemple, known1 et known2 sont des champs connus, tandis que inconnu1 et inconnu2 sont des champs arbitraires. Les champs inconnus peuvent avoir n'importe quel nom (clé) et valeur (string, bool, float64 ou int).

Notre objectif est de trouver un moyen idiomatique d'analyser un tel message JSON dans une structure.

Solution proposée

Nous pouvons définir la structure suivante :

<code class="go">type Message struct {
    Known1   string `json:"known1"`
    Known2   string `json:"known2"`
    Unknowns []map[string]interface{}
}</code>
Copier après la connexion

Avec cette structure, l'exemple de message JSON devrait donner le résultat suivant :

{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
Copier après la connexion

Solution alternative

Une autre option consiste à désorganiser le JSON dans une map[string]interface{} :

<code class="go">import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}`
    var msg map[string]interface{}
    fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg))
    fmt.Printf("%+v", msg)
}</code>
Copier après la connexion

Cela produira :

<nil>
map[known1:foo known2:bar unknown1:car unknown2:1]
Copier après la connexion

L'avantage de cette approche est que nous pouvons parcourir les clés et les valeurs et effectuer les assertions de type nécessaires pour gérer les données. Nous pouvons ou non remplir une structure avec les données en fonction de nos besoins.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal