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
DDDoriginal
2024-10-26 16:35:30836parcourir

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>

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>

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

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>

Cela produira :

<nil>
map[known1:foo known2:bar unknown1:car unknown2:1]

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!

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