Limba pe care o vorbesc API-urile
API-urile schimbă date sub formă de JSON — text ca {"id": 1, "name": "Ana"}. Pachetul encoding/json din Go traduce în ambele direcții: Marshal transformă o structură în JSON, iar Unmarshal completează o structură pornind de la JSON.
Etichetele de structură leagă cele două lumi: eticheta `json:"name"` pune în corespondență câmpul exportat Name din Go cu cheia JSON scrisă cu litere mici. Doar câmpurile exportate (cu prima literă mare) sunt traduse.
De la structură la JSON
json.Marshal produce JSON compact, pentru mașini; json.MarshalIndent produce JSON lizibil, pentru oameni și pentru jurnale. Opțiunea omitempty din etichetă elimină câmpurile care au valoarea zero.
Marshal, în formă lizibilă și compactă
Ana nu are e-mail, iar omitempty scoate complet câmpul gol din JSON-ul ei. Fișa completă a lui Ben se afișează indentată.
Ieșire: program Go și rezultatul capturat
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
}
func main() {
ana := User{ID: 1, Name: "Ana"}
compact, _ := json.Marshal(ana)
fmt.Println(string(compact))
ben := User{ID: 2, Name: "Ben", Email: "[email protected]"}
pretty, _ := json.MarshalIndent(ben, "", " ")
fmt.Println(string(pretty))
}
De la JSON la structură
json.Unmarshal analizează JSON-ul într-o structură pe care o oferi tu (ca pointer). Cheile JSON necunoscute sunt pur și simplu ignorate; cheile lipsă lasă valoarea zero. Eroarea returnată este singurul semnal că JSON-ul era greșit — verific-o mereu.
Unmarshal și cheia în plus ignorată
JSON-ul conține o cheie extra pe care structura nu o are — nicio eroare, este sărită. În schimb, un JSON stricat returnează o eroare adevărată.
Ieșire: program Go și rezultatul capturat
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
data := []byte(`{"id": 7, "name": "Cleo", "extra": "ignorat"}`)
var u User
if err := json.Unmarshal(data, &u); err != nil {
fmt.Println("JSON greșit:", err)
return
}
fmt.Printf("%+v\n", u)
var broken User
err := json.Unmarshal([]byte(`{"id": `), &broken)
fmt.Println("eroare:", err)
}
Date imbricate
Datele reale trimise de API-uri sunt imbricate: o comandă poartă cu ea utilizatorul și lista de articole. Structurile din structuri și feliile devin automat obiecte și tablouri JSON — nu e nevoie de nimic special.
O comandă cu un utilizator înăuntru
Structura imbricată User devine un obiect JSON imbricat, iar felia de articole devine un tablou JSON — forma datelor Go este forma JSON-ului.
Ieșire: program Go și rezultatul capturat
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
type Order struct {
ID int `json:"id"`
Items []string `json:"items"`
User User `json:"user"`
}
func main() {
order := Order{
ID: 1042,
Items: []string{"tastatură", "mouse"},
User: User{ID: 1, Name: "Ana"},
}
data, _ := json.MarshalIndent(order, "", " ")
fmt.Println(string(data))
}