Heim >Backend-Entwicklung >Golang >So konvertieren Sie JSON-Daten in Golang in einen Kartentyp

So konvertieren Sie JSON-Daten in Golang in einen Kartentyp

PHPz
PHPzOriginal
2023-04-21 14:20:375440Durchsuche

Da JSON in Golang ein gängiges Datenaustauschformat ist, ist auch die Konvertierung von JSON-Daten in eine Karte sehr häufig. In diesem Artikel stellen wir vor, wie man JSON-Daten mit Golang in einen Kartentyp konvertiert.

  1. Verwenden Sie die Unmarshal-Funktion der Standardbibliothek.

Die Standardbibliothek von Golang enthält viele JSON-bezogene Funktionen und Typen, von denen die wichtigste die json.Unmarshal-Funktion ist. Diese Funktion dekodiert JSON-Daten in Datenstrukturen der Go-Sprache.

Mit dieser Funktion können wir einen JSON-String in eine Karte konvertieren. Definieren Sie zunächst die Variable, die zum Speichern der JSON-Dekodierungsergebnisse verwendet wird, und erstellen Sie ein Byte-Array mit der JSON-Zeichenfolge. Rufen Sie dann die Funktion json.Unmarshal auf, um die JSON-Zeichenfolge in einen Kartentyp zu dekodieren.

Hier ist ein Beispiel:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var data = []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    err := json.Unmarshal(data, &result)

    if err != nil {
        fmt.Println("JSON转换失败:", err)
        return
    }

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}

Im obigen Code definieren wir ein Variablenergebnis vom Kartentyp, um das JSON-Dekodierungsergebnis zu speichern. Wenn Sie json.Unmarshal aufrufen, um eine JSON-Zeichenfolge zu dekodieren, müssen Sie die Adresse des Ergebnisses übergeben. Abschließend durchlaufen wir die Schlüssel-Wert-Paare im Ergebnis und geben sie aus. Die Ausgabe lautet wie folgt:

name : Tom
age : 28
gender : male
  1. Verwenden der Drittanbieter-Bibliothek easyjson

In Golang gibt es auch eine JSON-Serialisierungsbibliothek eines Drittanbieters namens easyjson, mit der JSON bequemer in den Datentyp der Go-Sprache konvertiert werden kann. Im Gegensatz zur Standardbibliothek json.Unmarshal verwendet easyjson die Codegenerierung, um die Parsing-Effizienz zu verbessern. Darüber hinaus unterstützt es erweiterte Funktionen wie das Parsen von JSON in Inline-Typen oder Hochgeschwindigkeitsiteration.

Um easyjson verwenden zu können, müssen Sie die Bibliothek installieren und den von ihr generierten Code in Ihren Go-Code einbinden. Installieren Sie zunächst easyjson:

go get github.com/mailru/easyjson

Als nächstes definieren Sie eine easyjson-Vorlage für den Datentyp, der in JSON konvertiert werden muss. Die easyjson-Vorlage besteht aus mehreren Dateien, von denen jede über eine .go-Datei und eine _easyjson.go-Datei verfügt.

Das Folgende ist ein Beispielcode, der die easyjson-Vorlage verwendet, um einen JSON-String in eine Karte zu konvertieren:

package main

import (
    "fmt"

    "github.com/mailru/easyjson/jlexer"
    "github.com/mailru/easyjson/jwriter"
)

type Person struct {
    Name   string `json:"name"`
    Age    int    `json:"age"`
    Gender string `json:"gender"`
}

func main() {
    data := []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    r := jlexer.Lexer{Data: data}
    result = parseMap(&r)

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}

func parseMap(r *jlexer.Lexer) map[string]interface{} {
    result := map[string]interface{}{}
    for {
        key := r.String()
        r.WantColon()
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result[key] = parseMap(r)
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result[key] = parseArray(r)
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result[key] = r.Int()
        case jlexer.String:
            result[key] = r.String()
        case jlexer.Null:
            result[key] = nil
        case jlexer.True:
            result[key] = true
        case jlexer.False:
            result[key] = false
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}

func parseArray(r *jlexer.Lexer) []interface{} {
    result := []interface{}{}
    for {
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result = append(result, parseMap(r))
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result = append(result, parseArray(r))
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result = append(result, r.Int())
        case jlexer.String:
            result = append(result, r.String())
        case jlexer.Null:
            result = append(result, nil)
        case jlexer.True:
            result = append(result, true)
        case jlexer.False:
            result = append(result, false)
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}

Im obigen Code definieren wir eine Struktur namens Person, um die Daten im JSON-String darzustellen. Anschließend erstellen wir einen JSON-String in einem leicht lesbaren Format.

In der Hauptfunktion verwenden wir jlexer.Lexer, um die JSON-Daten an die parseMap-Funktion zu übergeben und das Ergebnis in der Kartentypvariablen result zu speichern. Abschließend drucken wir den Inhalt der Schlüssel-Wert-Paare in der Karte aus.

In diesem Beispiel haben wir eine Funktion parseMap handgeschrieben, die JSON-Strings dekodiert. Diese Funktion liest den JSONLexer und ruft sich selbst rekursiv auf, um die JSON-Zeichenfolge zu analysieren. Schließlich wird ein Kartenobjekt der analysierten Ergebnisse zurückgegeben.

Mit dem von easyjson bereitgestellten Decoder können komplexe JSON-Strukturen problemlos analysiert werden. Wenn jedoch große Datenmengen in eine Karte dekodiert werden müssen, kann die Analyseeffizienz verringert werden.

Fazit

Es gibt mehrere Möglichkeiten, JSON-Daten in Golang in eine Karte zu konvertieren. Die Standardbibliothek stellt json.Unmarshal bereit, mit dem JSON-Daten direkt in eine Karte dekodiert werden können. Die Drittanbieterbibliothek easyjson bietet eine effizientere Lösung, erfordert jedoch mehr Einrichtung und Konfiguration.

Wählen Sie je nach Situation die passende Lösung. Wenn Sie nur eine einfache JSON-Zeichenfolge dekodieren müssen, können Sie die Standardbibliothek verwenden. Wenn Sie eine große Datenmenge oder eine komplexere Struktur dekodieren müssen, können Sie die Bibliothek eines Drittanbieters easyjson verwenden.

Das obige ist der detaillierte Inhalt vonSo konvertieren Sie JSON-Daten in Golang in einen Kartentyp. 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