encoding/json.MarshalIndent în Go

Ca Marshal, dar scrie JSON-ul pe mai multe rânduri, indentat, ușor de citit (fișiere de configurare, afișare).

Sintaxă
func MarshalIndent(v any, prefix, indent string) ([]byte, error)

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 este prefix, apoi indent.
  • Folosești MarshalIndent pentru fiecare răspuns al unui API cu trafic mare: spațiile măresc răspunsul. Folosește Marshal sau un Encoder.

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.