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