Maison  >  Article  >  développement back-end  >  Comment désorganiser les données JSON arbitraires en Go avec un schéma dynamique basé sur le code ?

Comment désorganiser les données JSON arbitraires en Go avec un schéma dynamique basé sur le code ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 08:22:30679parcourir

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

Désassembler les données arbitraires avec JSON et Go

Vous avez une exigence spécifique : désorganiser les données JSON de manière à vous permettre de les traiter dans parties ou sections. Pour y parvenir, vous envisagez une structure dans laquelle la première moitié des données, ou « code », indique comment interpréter la seconde moitié. Deux structures potentielles pour la seconde moitié sont Range et User.

Le défi

Le package json existant dans Go fournit des fonctions pratiques pour regrouper et désorganiser les structures définies, mais il ne répond pas à votre besoin de données arbitraires.

Décodage de la solution

La solution consiste à introduire un champ json.RawMessage (Payload) dans votre structure de message. Ce champ vous permet de retarder l'analyse des données jusqu'à ce que vous connaissiez le code spécifié dans la première moitié.

Voici un exemple d'implémentation dans Go :

<code class="go">type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    json.Unmarshal(m, &message)
    var payload interface{}
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
}</code>

Utilisation

Vous utiliseriez cette solution en désorganisant d'abord la "moitié supérieure" à l'aide de la fonction json.Unmarshal. Ensuite, sur la base du code récupéré de la « moitié supérieure », vous annulerez le tri de la « moitié inférieure » en utilisant à nouveau la fonction json.Unmarshal, en fournissant cette fois l'objet json.RawMessage cible.

Exemple

<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
MyUnmarshall(json) // This will decode the data into a Range object</code>

Considérations

Cette technique vous permet de gérer le déclassement de données arbitraires de manière structurée et flexible. Cependant, cela introduit une dépendance à l'exécution sur la connaissance du code à l'avance et sur l'existence de structures correspondantes pour différents codes.

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