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
Libérer: 2024-12-30 07:07:09
original
1021 Les gens l'ont consulté

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

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!

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