Maison >développement back-end >Golang >Comment éviter le double démarshalage lors de l'analyse de JSON dans Go ?

Comment éviter le double démarshalage lors de l'analyse de JSON dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 07:07:091037parcourir

How to Avoid Double Unmarshaling When Parsing JSON in Go?

Désassembler JSON dans Go sans double démarshalling

Dans Go, il est possible de faire face à une situation où vous devez analyser JSON dans diverses structures, mais un double désorganisation se produit, conduisant à une redondance. Cet article présente une solution qui implique de désassembler partiellement les données pour éviter la deuxième étape de désorganisation.

Comprendre le problème

Lorsque vous essayez d'analyser JSON dans des structures connues, un problème courant L'approche est :

  1. Unmarshal JSON dans un générique map[string]interface{}
  2. Trouver la clé attendue
  3. Essayez de convertir la valeur en type souhaité
  4. Si la conversion échoue, rassemblez la valeur en JSON et annulez-la au type souhaité (double démarshalling)

Le Solution

Au lieu de convertir la valeur en interface{}, on peut la désorganiser dans un json.RawMessage. Cela désorganise partiellement les données et permet une désorganisation ultérieure vers des structures spécifiques en fonction de la valeur clé.

Exemple de code

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

    jsonAck, ok := myMap["ack"]
    if !ok {
        fmt.Println("key 'ack' not found")
        return
    }

    err = json.Unmarshal(jsonAck, &myAck)
    if err != nil {
        fmt.Println("unmarshal error", err)
    } else {
        fmt.Println("New ack object: ", myAck)
    }
}

Dans ce code modifié, nous remplaçons la carte [string]interface{} avec map[string]json.RawMessage. Lors de la manipulation de la clé « ack », nous procédons au démarshaling directement vers la structure Ack, éliminant ainsi le besoin d'un double démarshalling.

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