Heim >Backend-Entwicklung >Golang >Wie kann ich JSON in Go ohne redundantes Unmarshaling effizient analysieren?

Wie kann ich JSON in Go ohne redundantes Unmarshaling effizient analysieren?

Susan Sarandon
Susan SarandonOriginal
2024-12-29 11:27:10482Durchsuche

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

JSON ohne redundantes Unmarshaling in Go analysieren

Beim Umgang mit JSON-Nachrichten, die unterschiedliche Datentypen enthalten, kann ein gängiger Ansatz das Unmarshaling der Daten in einer generischen Karte umfassen[ string]interface{}, um den Schlüssel zu überprüfen und zu versuchen, den Wert in bestimmte Strukturen umzuwandeln. Dieser Ansatz kann jedoch zu unnötigem doppeltem Unmarshaling führen.

Im Kontext von Go gibt es eine effizientere Lösung, die JSON-Daten teilweise in eine json.RawMessage statt in eine Schnittstelle{} zu entmarshalieren. Dies wird erreicht, indem die Karte wie folgt deklariert wird:

var myMap map[string]json.RawMessage

Wenn es darum geht, die Werte in bestimmte Strukturen umzuwandeln, kann der Marshalling-/Unmarshaling-Schritt entfallen. In Ihrem Fall haben Sie beispielsweise Folgendes in Ihre „Ack“-Struktur umgewandelt:

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

Stattdessen kann es wie folgt vereinfacht werden:

err = json.Unmarshal(v, &myAck)

Dieser Ansatz vermeidet das redundante Unmarshaling Schritt, wodurch das Parsen effizienter wird.

Hier ist eine aktualisierte Version Ihres Codes, die dies berücksichtigt Optimierung:

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

Durch die Verwendung von json.RawMessage und die Eliminierung unnötiger Unmarshaling können Sie die Leistung Ihres JSON-Parsings verbessern, ohne die Funktionalität zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie kann ich JSON in Go ohne redundantes Unmarshaling effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn