Maison  >  Article  >  développement back-end  >  Comment désassembler des données JSON arbitraires avec des structures variables basées sur un « code » ?

Comment désassembler des données JSON arbitraires avec des structures variables basées sur un « code » ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 10:21:03531parcourir

How to Unmarshal Arbitrary JSON Data with Varying Structures Based on a

Désorganisation des données JSON arbitraires

Question :

Les données JSON peuvent-elles être organisées d'une manière qui permet de le décomposer en parties ou sections ? Dans ce scénario, la moitié supérieure des données définit un « code » qui indique le type de données dans la moitié inférieure, qui peut varier d'une structure à l'autre. Comment cela peut-il être réalisé dans Go ?

Réponse :

Pour désorganiser les données JSON arbitraires où la moitié inférieure peut varier entre les structures, vous pouvez retarder l'analyse de la moitié inférieure jusqu'à ce que le "code" de la moitié supérieure est connu.

Implémentation :

  1. Définissez une structure de message avec un champ de code int et un champ de charge utile json.RawMessage . Ce champ stockera temporairement la moitié inférieure non analysée.
  2. Créez des fonctions pour analyser et démonter les différents types de structure en fonction du code.
  3. Décomposer la structure Message à partir des données JSON. Cela analysera la moitié supérieure des données et retardera l'analyse de la moitié inférieure.
  4. Sur la base du code, créez une instance du type de structure approprié et désorganisez-y la charge utile.

Exemple de code :

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message)
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
    fmt.Printf("\n%v%+v", message.Code, payload)
}

func main() {
    json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    MyUnmarshall(json)
    json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    MyUnmarshall(json)
}</code>

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