JSON (JavaScript Object Notation) är ett mycket mångsidigt och mycket populärt dataformat. Det används ofta för kommunikation mellan webbappar och även som ett bekvämt sätt att lagra stora mängder strukturerad applikationsdata.
JSON är så användbart att nästan alla moderna programmeringsspråk ger inbyggt stöd för att arbeta med det, inklusive Go.
Arbeta med JSON i Go
Du kan dela upp det mesta av det arbete du kommer att göra med JSON i två allmänna kategorier: marshaling och unmarshaling. Wikipedia definierar marshaling som:
Inom datavetenskap är marshaling processen att omvandla minnesrepresentationen av ett objekt till ett dataformat som är lämpligt för lagring eller överföring. Det används vanligtvis när data måste flyttas mellan olika delar av ett datorprogram eller från ett program till ett annat.
I enklare termer är marshaling processen att omvandla data lagrad i en variabel till en form som är lättare att överföra till ett annat program. Unmarshaling är den omvända processen: det innebär att ta data som formaterats för transport och konvertera den till en form som är lättare för ditt program att använda.
Med Go kan du sortera infödda datastrukturer i JSON. Och du kan utföra den omvända åtgärden, dela upp JSON-data till Go-variabler.
Marshaling till JSON i Go
Go tillhandahåller encoding/json-paketet för att göra det enkelt för dig att arbeta med JSON. Det här paketet innehåller flera funktioner, men den du kommer att använda för marshaling är Marskalk fungera. Marskalk har följande funktionssignatur:
func marskalk (v gränssnitt{}) ([]byte, fel)
Detta innebär att Marskalk accepterar en parameter av valfri datatyp och returnerar två värden: en bit av byte och ett fel. Du ringer med andra ord Marskalk med ett Go-värde, och det konverterar det till JSON och returnerar JSON-motsvarigheten. Om det stöter på ett fel under konverteringsprocessen returnerar det felet och en tom del.
Här är ett kodexempel som använder Marskalk för att konvertera en karta till JSON. För att köra det här exemplet behöver du bara skapa en Go-fil i din favoritkodredigerare, eller använd Gå på lekplatsen:
paket huvud
importera (
"kodning/json"
"fmt"
)func huvud(){
val := karta[sträng]int{
"john": 25,
"mary": 19,
"Adam": 5,
}
res, _ := json. Marskalk (val)
fmt.Skriv ut(sträng(res))
}
Om du kör den koden kommer den att mata ut följande:
Som nämnts tidigare kan du sortera vilken typ av Go-data som helst till JSON, men i verkligheten kommer du vanligtvis att samla strukturer. På grund av detta tillhandahåller Go en funktion som kallas struct-taggar som låter dig ge Marskalk extra instruktioner för att konvertera dina strukturer.
En struct-tagg är en sträng som du inkluderar i din struct-deklaration bredvid datatypen för ett fält. Med strukturtaggar kan du justera vägen Marskalk behandlar fältet taggen tillhör. Du kan använda struct-taggar för att byta namn på ett fält i JSON-utgången, eller till och med utelämna det helt. Strukturtaggar (det Marskalk känner igen) börja med delsträngen "json:".
Som ett exempel, Säg att du har en struktur Bil som representerar viss information om en bil. Här är koden för att skapa en Bil och flytta den till JSON:
paket huvud
importera (
"kodning/json"
"fmt"
)
func huvud(){
typ Bilkonstruktion {
Märkessträng
Modell sträng
Pris int
}
val := Bil{Märke: "Mercedes", Modell: "Benz", Pris: 50 000}
res, _ := json. Marskalk (val)
fmt.Skriv ut(sträng(res))
}
Denna kod producerar utdata:
De varumärke, Modell, och Pris fält av Bil måste börja med versaler, eller Marskalk kommer inte att kunna konvertera dem. Detta resulterar i att JSON-utdatafälten också börjar med versaler. Men vad händer om du vill att namnen ska börja med gemener i JSON, eller om du vill byta namn på ett fält helt? Det är där struct-taggarna kommer in. Här är ett exempel:
paket huvud
importera (
"kodning/json"
"fmt"
)
func huvud(){
typ Bilkonstruktion {
ID int `json:"-"`
Varumärkessträng `json:"typ"`
Modellsträng `json:"modell"`
Pris int `json:"pris"`
}
val := Bil{ID: 0, Märke: "Mercedes", Modell: "Benz", Pris: 50 000}
res, _ := json. Marskalk (val)
fmt.Skriv ut(sträng(res))
}
Denna kod introducerar ett nytt ID-fält som Marskalk utelämnar från JSON-utgången via en struct-tagg. Koden använder också struct-taggar för att byta namn på de andra struct-fälten. Här är programmets utdata:
Som du kan se blir den del av struct-taggen som följer "json:" namnet på fältet i Marshals utdata. Det finns ett undantag: om det är strängen "-", utelämnar Marshal det fältet från utgången. Du kan läsa mer om Marshal och struct-taggar i Gå dokumentation.
Unmarshaling från JSON i Go
Encoding/json-paketet tillhandahåller också en unmarshaling-funktion, kallad Unmarshal. Den har följande funktionssignatur:
func Unmarshal (data []byte, v gränssnitt{}) fel
Till skillnad från Marskalk, Unmarshal returnerar inte ett värde. Istället accepterar den JSON som en bit av byte i det första argumentet och lagrar sedan den konverterade datan i objektet som det andra argumentet pekar på. Unmarshal fungerar också med struct-taggar, men här berättar taggarna Unmarshal vilka JSON-fält matchar vilka struct-fält.
När du avmarscherar i ett program kan du hämta data från ett API, men här kommer du att använda dummy-data. Så här använder du Unmarshal:
paket huvud
importera (
"kodning/json"
"fmt"
)func huvud(){
typ Bilkonstruktion {
ID int `json:"-"`
Varumärkessträng `json:"typ"`
Modellsträng `json:"modell"`
Pris int `json:"pris"`
}jsonInput := `{
"typ": "Toyota",
"modell": "Camry",
"pris": 2000
}`var jsonOutput bil
fel := json. Unmarshal([]byte(jsonInput), &jsonOutput)om fel != noll {
fmt. Println("JSON-avkodningsfel!")
lämna tillbaka
}
fmt.Skriv ut(jsonOutput)
}
Den här koden använder samma biltyp som föregående exempel, och den delar upp ett JSON-objekt till en struktur av typen Car och skriver sedan ut data i strukturen. När programmet körs producerar programmet denna utdata:
Detta visar att dummy JSON-data framgångsrikt delas upp i jsonOutput struktur.
Go gör det enkelt att arbeta med JSON
Med encoding/json-paketet är det lika enkelt att arbeta med JSON i Go som två funktionsanrop: Marshaland Unmarshal. Go låter dig också anpassa processen för att rangordna/avmarkera JSON med struct-taggar.
Att konvertera data till JSON är ett bra sätt att dela det med ett annat program eller en annan process. Formatet är så universellt att JSON är så portabelt som möjligt.