JSON (JavaScript Object Notation) is een zeer veelzijdig en enorm populair gegevensformaat. Het wordt vaak gebruikt voor communicatie tussen web-apps en ook als een handige manier om grote hoeveelheden gestructureerde applicatiegegevens op te slaan.

JSON is zo handig dat bijna alle moderne programmeertalen ingebouwde ondersteuning bieden om ermee te werken, inclusief Go.

Werken met JSON in Go

U kunt het meeste werk dat u met JSON doet, opsplitsen in twee algemene categorieën: marshaling en unmarshaling. Wikipedia definieert rangeren als:

In de informatica is marshaling het proces waarbij de geheugenrepresentatie van een object wordt omgezet in een gegevensformaat dat geschikt is voor opslag of verzending. Het wordt meestal gebruikt wanneer gegevens moeten worden verplaatst tussen verschillende delen van een computerprogramma of van het ene programma naar het andere.

In eenvoudiger bewoordingen is marshaling het proces waarbij gegevens die in een variabele zijn opgeslagen, worden omgezet in een vorm die gemakkelijker kan worden doorgegeven aan een ander programma. Unmarshaling is het omgekeerde proces: het omvat het nemen van gegevens die zijn geformatteerd voor transport en deze converteren naar een vorm die gemakkelijker te gebruiken is voor uw programma.

instagram viewer

Met Go kun je native datastructuren in JSON verwerken. En u kunt de omgekeerde actie uitvoeren door JSON-gegevens te ontrafelen in Go-variabelen.

Marshalling naar JSON in Go

Go biedt de codering/json-pakket om het u gemakkelijk te maken om met JSON te werken. Dit pakket bevat verschillende functies, maar degene die u gaat gebruiken voor marshaling is de Maarschalk functie. Maarschalk heeft de volgende functiehandtekening:

func maarschalk (v koppel{}) ([]byte, fout)

Dit betekent dat Maarschalk accepteert een parameter van elk gegevenstype en retourneert twee waarden: een stukje bytes en een fout. Met andere woorden, u belt Maarschalk met een Go-waarde, en het converteert het naar JSON en retourneert het JSON-equivalent. Als het tijdens het conversieproces een fout tegenkomt, retourneert het de fout en een leeg segment.

Hier is een codevoorbeeld dat gebruikt Maarschalk om een ​​kaart naar JSON te converteren. Om dit voorbeeld uit te voeren, hoeft u alleen maar een Go-bestand te maken in je favoriete code-editor, of gebruik de Ga speeltuin:

pakket voornaamst

importeren (
"codering/json"
"fmt"
)

func voornaamst(){
val := map[tekenreeks]int{
"John": 25,
"Maria": 19,
"Adam": 5,
}

res, _ := json. Maarschalk (val)
fmt.Println(snaar(res))
}

Als u die code uitvoert, wordt het volgende uitgevoerd:

Zoals eerder vermeld, kunt u elk type Go-gegevens naar JSON rangschikken, hoewel u in het echte leven meestal structuren zult rangschikken. Daarom biedt Go een functie genaamd struct-tags om je te laten geven Maarschalk extra instructies voor het converteren van je structs.

Een struct-tag is een tekenreeks die u opneemt in uw struct-declaratie naast het gegevenstype van een veld. Met structurele tags kunt u de manier aanpassen Maarschalk behandelt het veld waartoe de tag behoort. U kunt struct-tags gebruiken om de naam van een veld in de JSON-uitvoer te wijzigen of zelfs helemaal weg te laten. Structure-tags (dat Maarschalk herkent) beginnen met de subtekenreeks "json:".

Stel dat je een struct hebt Auto dat vertegenwoordigt enige informatie over een auto. Hier is de code om een Auto en rangschik het naar JSON:

pakket voornaamst

importeren (
"codering/json"
"fmt"
)

func voornaamst(){
type Autostructuur {
Merk string
Modeltekenreeks
Prijs int
}
val := Auto{Merk: "Mercedes", Model: "Benz", Prijs: 50000}
res, _ := json. Maarschalk (val)
fmt.Println(snaar(res))
}

Deze code produceert de uitvoer:

De Merk, Model, En Prijs velden van Auto moet beginnen met hoofdletters, of Maarschalk zal ze niet kunnen converteren. Hierdoor beginnen de JSON-uitvoervelden ook met hoofdletters. Maar wat als je de namen in de JSON met een kleine letter wilt laten beginnen, of als je een veld helemaal wilt hernoemen? Dat is waar de struct-tags binnenkomen. Hier is een voorbeeld:

pakket voornaamst
importeren (
"codering/json"
"fmt"
)
func voornaamst(){
type Autostructuur {
ID int `json:"-"`
Merkstring `json:"type"`
Modelstring `json:"model"`
Prijs int `json:"prijs"`
}
val := Auto{ID: 0, Merk: "Mercedes", Model: "Benz", Prijs: 50000}
res, _ := json. Maarschalk (val)
fmt.Println(snaar(res))
}

Deze code introduceert een nieuw ID-veld dat Maarschalk weggelaten uit de JSON-uitvoer via een struct-tag. De code gebruikt ook struct-tags om de andere struct-velden een andere naam te geven. Hier is de uitvoer van het programma:

Zoals je kunt zien, wordt het deel van de struct-tag na "json:" de naam van het veld in de uitvoer van Marshal. Er is één uitzondering: als het de tekenreeks "-" is, laat Marshal dat veld weg uit de uitvoer. U kunt meer lezen over Marshal en struct-tags in de Ga documentatie.

Unmarshalen van JSON in Go

Het pakket codering/json biedt ook een unmarshaling-functie, genaamd onmaarschalk. Het heeft de volgende functiehandtekening:

func Unmarshal (gegevens[]byte, v koppel{}) fout

in tegenstelling tot Maarschalk, onmaarschalk geeft geen waarde terug. In plaats daarvan accepteert het JSON als een stuk bytes in het eerste argument en slaat vervolgens de geconverteerde gegevens op in het object waarnaar wordt verwezen door het tweede argument. onmaarschalk werkt ook met struct-tags, maar hier vertellen de tags onmaarschalk welke JSON-velden overeenkomen met welke struct-velden.

Bij het ontrafelen van een programma zou dat kunnen gegevens ophalen uit een API, maar hier gebruikt u dummygegevens. Hier is hoe je gebruikt onmaarschalk:

pakket voornaamst

importeren (
"codering/json"
"fmt"
)

func voornaamst(){
type Autostructuur {
ID int `json:"-"`
Merkstring `json:"type"`
Modelstring `json:"model"`
Prijs int `json:"prijs"`
}

jsonInput := `{
"type": "Toyota",
"model": "Camry",
"prijs": 2000
}`

var jsonOutput auto
fout := json. Unmarshal([]byte(jsonInput), &jsonOutput)

als err != nihil {
fmt. Println("JSON-decodeerfout!")
opbrengst
}

fmt.Println(jsonUitvoer)
}

Deze code gebruikt hetzelfde Car-type als het vorige voorbeeld, en unmarshalst een JSON-object in een struct van het type Car, en drukt vervolgens de gegevens in de struct af. Wanneer het programma wordt uitgevoerd, produceert het deze uitvoer:

Dit laat zien dat de dummy JSON-gegevens met succes zijn ontcijferd in de jsonUitvoer structuur.

Go maakt het gemakkelijk om met JSON te werken

Met het encoding/json-pakket is werken met JSON in Go net zo eenvoudig als twee functieaanroepen: Marsha en Unmarshal. Met Go kun je ook het proces van marshaling/unmarshaling van JSON aanpassen met struct-tags.

Het converteren van gegevens naar JSON is een geweldige manier om deze te delen met een ander programma of proces. Het formaat is zo universeel dat JSON zo draagbaar mogelijk is.