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 ?
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!