Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-01 08:22:30
original
679 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!