Maison > développement back-end > Golang > Comment json.RawMessage peut-il empêcher le double démarshalage lors de la gestion de structures JSON hétérogènes ?

Comment json.RawMessage peut-il empêcher le double démarshalage lors de la gestion de structures JSON hétérogènes ?

Mary-Kate Olsen
Libérer: 2024-12-27 21:34:10
original
974 Les gens l'ont consulté

How Can json.RawMessage Prevent Double Unmarshaling in Go When Handling Heterogeneous JSON Structures?

Utiliser RawMessage pour éviter le double démarshaling dans Go

Dans Go, lorsque l'on travaille avec des données JSON, il est parfois nécessaire de démarshaler partiellement les données afin d'accéder à des champs inconnus ou gérer des structures JSON hétérogènes. Cependant, ce processus peut conduire à un double démarchage, ce qui peut s'avérer inefficace. Cet article présente une solution pour éviter ce problème à l'aide de json.RawMessage.

Considérez un scénario dans lequel une connexion socket Web envoie différents types de messages JSON et vous souhaitez les transformer en structures connues. L'approche traditionnelle consiste à désassembler le JSON dans une map[string]interface{} générique, à rechercher la clé souhaitée, puis à tenter de convertir la valeur dans le type souhaité. Cependant, cette approche peut échouer lorsque vous travaillez avec des structures JSON imbriquées.

Pour résoudre ce problème, au lieu de désassembler les valeurs dans interface{}, nous pouvons les désorganiser dans json.RawMessage. Cela nous permet d'accéder aux données JSON brutes sans perdre les informations de type. Plus tard, dans l'instruction switch, nous pouvons directement désorganiser les données JSON brutes dans la structure souhaitée sans avoir besoin de les réorganiser.

import (
    "encoding/json"
    "fmt"
)

type Ping struct {
    Ping string `json:"ping"`
}

type Ack struct {
    Messages []Message `json:"messages"`
}

type Message string

func main() {
    testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
    var myAck = Ack{}
    var myMap map[string]json.RawMessage
    err := json.Unmarshal(testJSON, &myMap)
    if err != nil {
        fmt.Println("error unmarshalling: ", err)
    }

    for k, v := range myMap {
        fmt.Printf("key: %s, value: %s \n", k, v)

        switch k {
        case "ping":
            fmt.Println(k, " is a ping", v)
        case "ack":
            fmt.Println(k, " is an ack containing a message list")
            err = json.Unmarshal(v, &myAck)
            if err != nil {
                fmt.Println("unmarshal error", err)
            } else {
                fmt.Println("New ack object: ", myAck)
            }
        default:
            fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v)
        }
    }
}
Copier après la connexion

Avec cette approche, nous évitons l'étape redondante de marshalling et de démarshalling. les données JSON, ce qui rend plus efficace et plus simple la gestion des données JSON avec des structures hétérogènes.

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