Ce face encoding/json.MarshalIndent
json.MarshalIndent(v, "", " ") produce același JSON ca Marshal, dar pune fiecare element pe rândul lui și îl indentează cu textul indent pentru fiecare nivel (de obicei două spații sau "\t"). prefix se pune la începutul fiecărui rând în afară de primul; aproape întotdeauna este "".
Este potrivit pentru fișiere citite de oameni (configurări, exporturi), pentru jurnale de depanare și pentru răspunsuri de API în modul de dezvoltare. Pentru trafic real, Marshal este mai mic și mai rapid. Toate regulile etichetelor (omitempty, -, nume) se aplică la fel.
Parametri
| Parametru | Descriere |
|---|---|
v |
Valoarea de transformat. |
prefix |
Text pus la începutul fiecărui rând nou (de obicei ""). |
indent |
Textul folosit pentru un nivel de indentare: " ", " " sau "\t". |
Ce returnează
JSON-ul indentat ([]byte) și o eroare.
Exemple
Exemplul 1: O factură, ușor de citit
package main
import (
"encoding/json"
"fmt"
)
type Linie struct {
Produs string `json:"produs"`
Bucati int `json:"bucati"`
Pret float64 `json:"pret"`
}
type Factura struct {
Numar string `json:"numar"`
Client string `json:"client"`
Linii []Linie `json:"linii"`
Total float64 `json:"total"`
Achitat bool `json:"achitat"`
Note string `json:"note,omitempty"`
}
func main() {
f := Factura{
Numar: "DX-2026-0147",
Client: "SC Exemplu SRL, Iași",
Linii: []Linie{
{"Hosting anual", 1, 480},
{"Domeniu .ro", 2, 45.5},
},
Achitat: true,
}
for _, l := range f.Linii {
f.Total += float64(l.Bucati) * l.Pret
}
date, err := json.MarshalIndent(f, "", " ")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(date))
}
Rezultat
{
"numar": "DX-2026-0147",
"client": "SC Exemplu SRL, Iași",
"linii": [
{
"produs": "Hosting anual",
"bucati": 1,
"pret": 480
},
{
"produs": "Domeniu .ro",
"bucati": 2,
"pret": 45.5
}
],
"total": 571,
"achitat": true
}
Exemplul 2: Salvarea setărilor într-un fișier
Indentăm cu tab și salvăm cu os.WriteFile; apoi citim fișierul înapoi.
package main
import (
"encoding/json"
"fmt"
"os"
)
type Setari struct {
Port int `json:"port"`
BazaDate string `json:"baza_date"`
Depanare bool `json:"depanare"`
Limite map[string]int `json:"limite"`
}
func main() {
s := Setari{
Port: 8080,
BazaDate: "mysql://localhost/magazin",
Limite: map[string]int{"cereri_pe_minut": 120, "marime_upload_mb": 10},
}
date, _ := json.MarshalIndent(s, "", "\t")
if err := os.WriteFile("setari.json", date, 0o644); err != nil {
fmt.Println(err)
return
}
continut, _ := os.ReadFile("setari.json")
fmt.Println(string(continut))
cuPrefix, _ := json.MarshalIndent(map[string]int{"a": 1, "b": 2}, "// ", " ")
fmt.Println(string(cuPrefix))
}
Rezultat
{
"port": 8080,
"baza_date": "mysql://localhost/magazin",
"depanare": false,
"limite": {
"cereri_pe_minut": 120,
"marime_upload_mb": 10
}
}
{
// "a": 1,
// "b": 2
// }
Greșeli frecvente
- Pui indentarea în locul prefixului:
MarshalIndent(v, " ", "")dă JSON pe mai multe rânduri, dar fără niveluri. Ordinea esteprefix, apoiindent. - Folosești
MarshalIndentpentru fiecare răspuns al unui API cu trafic mare: spațiile măresc răspunsul. FoloseșteMarshalsau unEncoder.
Comenzi înrudite
encoding/json.Marshal: Transformă o valoare Go (structură, map, slice) în JSON compact; etichetele json:”…” aleg numele și regulile câmpurilor.encoding/json.Indent: Reformatează un text JSON existent: Indent îl aranjează pe rânduri, Compact elimină spațiile inutile.encoding/json.NewEncoder: Creează un Encoder care scrie JSON direct într-un io.Writer (răspuns HTTP, fișier, ecran); Encode scrie o valoare.encoding/json.Unmarshal: Citește JSON și completează o valoare Go (structură, map, slice) dată prin pointer; potrivește cheile după etichetele json.