Maison  >  Article  >  développement back-end  >  Comment puis-je désorganiser les données JSON imbriquées sans connaître leur structure ?

Comment puis-je désorganiser les données JSON imbriquées sans connaître leur structure ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 16:55:03321parcourir

How can I unmarshal nested JSON data without knowing its structure?

Désorganisation du JSON imbriqué sans structure connue

Lorsque vous rencontrez des données JSON imbriquées sans structures définies, il existe plusieurs approches pour atténuer les difficultés liées à la désorganisation.

Éviter les démarshals répétés

Il est généralement conseillé de minimiser les opérations de démarshaling. Envisagez de mettre en œuvre un mécanisme de mise en cache pour stocker les objets non organisés pour une utilisation future et éviter les opérations répétitives. Cependant, dans certains cas, plusieurs désorganisations peuvent être nécessaires, en particulier lorsqu'il s'agit de structures imbriquées de différents types.

Détermination de la structure correcte pour la désorganisation

Méthode 1 : Désassembler pour map[string]interface{}

Désassembler le json.RawMessage dans une map[string]interface{}. Cela permet d'examiner la structure imbriquée pour identifier le type et, par la suite, la structure correcte dans laquelle se désorganiser.

Exemple :

<code class="go">var objMap map[string]interface{}
json.Unmarshal(rawMessage, &objMap)</code>

Méthode 2 : Regular Expression Match

Utilisez une expression régulière pour faire correspondre la chaîne de type dans les données JSON. Une fois le type connu, utilisez la réflexion ou un commutateur de type pour annuler le regroupement dans la structure correspondante.

Exemple :

<code class="go">type Regex *regexp.Regexp

// Split the JSON data into key-value pairs
type KeyValue struct {
    Key   string
    Value string
}

// Regex for extracting the type
var typeRE = Regex(regexp.MustCompile(`(?m)^.*"type": "(.+)".*$`))

// Unmarshal the raw message and extract the type
func getType(rawMessage []byte) (string, error) {
    var data KeyValue
    err := json.Unmarshal(rawMessage, &data)
    if err != nil {
        return "", err
    }
    matches := typeRE.FindStringSubmatch(data.Value)
    return matches[1], nil
}</code>

Utilisation de la copie ou de la version régulière Approche d'expression

Méthode A : Copier et annuler le marshal

  1. Créer une copie du json.RawMessage.
  2. Annuler le marshal de la copie dans une interface{} pour identifier le type.
  3. Désorganisez le json.RawMessage original dans la structure du type déterminé.

Méthode B : expression régulière et démarshal

  1. Utilisez l'expression régulière pour déterminer le type.
  2. Utilisez la réflexion ou un commutateur de type pour créer une nouvelle instance de la structure avec le type déterminé.
  3. Désorganisez le json.RawMessage dans la structure nouvellement créée.

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