Maison > développement back-end > Golang > Comment puis-je analyser efficacement JSON dans Go sans démarshaling redondant ?

Comment puis-je analyser efficacement JSON dans Go sans démarshaling redondant ?

Susan Sarandon
Libérer: 2024-12-29 11:27:10
original
482 Les gens l'ont consulté

How Can I Efficiently Parse JSON in Go Without Redundant Unmarshaling?

Analyse JSON sans démarshalage redondant dans Go

Lorsque vous traitez des messages JSON contenant différents types de données, une approche courante peut impliquer de démarshaler les données dans une carte générique[ string]interface{} pour inspecter la clé et tenter de convertir la valeur en structures spécifiques. Cependant, cette approche peut conduire à un double démarshalage inutile.

Dans le contexte de Go, il existe une solution plus efficace pour démarshaler partiellement les données JSON dans un json.RawMessage au lieu d'une interface{}. Ceci est réalisé en déclarant la carte comme :

var myMap map[string]json.RawMessage
Copier après la connexion

Lorsqu'il s'agit de convertir les valeurs en structures spécifiques, l'étape de marshaling/unmarshaling peut être éliminée. Par exemple, dans votre cas, vous effectuiez un casting vers votre structure "Ack" en utilisant :

ackjson, err := json.Marshal(v)
if err != nil {
    fmt.Println("marshal error: ", err)
}
err = json.Unmarshal(ackjson, &myAck)
if err != nil {
    fmt.Println("unmarshal error", err)
}
Copier après la connexion

Au lieu de cela, cela peut être simplifié en :

err = json.Unmarshal(v, &myAck)
Copier après la connexion

Cette approche évite le démarshaling redondant étape, rendant l'analyse plus efficace.

Voici une version mise à jour de votre code qui intègre ceci optimisation :

package main

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

En utilisant json.RawMessage et en éliminant le démarshaling inutile, vous pouvez améliorer les performances de votre analyse JSON sans compromettre la fonctionnalité.

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