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