encoding/json.Indent în Go

Reformatează un text JSON existent: Indent îl aranjează pe rânduri, Compact elimină spațiile inutile.

Sintaxă
func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
func Compact(dst *bytes.Buffer, src []byte) error

Ce face encoding/json.Indent

Spre deosebire de MarshalIndent, care pornește de la o valoare Go, json.Indent pornește de la un text JSON gata făcut (de exemplu răspunsul unui API) și scrie în dst varianta indentată. Ordinea cheilor și valorile rămân exact cum erau.

json.Compact face invers: elimină toate spațiile și rândurile noi care nu fac parte din texte, pentru stocare sau transmitere. Ambele returnează eroare dacă textul nu este JSON valid. Rezultatul se scrie într-un bytes.Buffer, pe care îl citești cu buf.String() sau buf.Bytes().

Parametri

Parametru Descriere
dst Bufferul în care se scrie rezultatul (se adaugă la ce conține deja).
src JSON-ul de reformatat.
prefix, indent Ca la MarshalIndent (doar la Indent).

Ce returnează

nil sau o eroare de sintaxă.

Exemple

Exemplul 1: Aranjarea unui răspuns primit

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

func main() {
	raspuns := []byte(`{"oras":"Iași","temperaturi":[14,16,11],"vant":{"viteza":12,"directie":"NV"}}`)
	var buf bytes.Buffer
	if err := json.Indent(&buf, raspuns, "", "  "); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(buf.String())
}

Rezultat

{
  "oras": "Iași",
  "temperaturi": [
    14,
    16,
    11
  ],
  "vant": {
    "viteza": 12,
    "directie": "NV"
  }
}

Exemplul 2: Compact și eroare de sintaxă

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

func main() {
	frumos := []byte(`{
    "nume": "Ana Pop",
    "note": [ 9, 10, 8 ],
    "bursa": true
}`)
	var buf bytes.Buffer
	json.Compact(&buf, frumos)
	fmt.Println(buf.String())
	fmt.Println(len(frumos), "->", buf.Len(), "octeți")

	buf.Reset()
	err := json.Compact(&buf, []byte(`{"nume": "Ana",}`))
	fmt.Println("Eroare:", err)
}

Rezultat

{"nume":"Ana Pop","note":[9,10,8],"bursa":true}
70 -> 47 octeți
Eroare: invalid character '}' looking for beginning of object key string

Greșeli frecvente

  • Refolosești bufferul fără Reset(): rezultatul nou se adaugă după cel vechi.
  • Folosești Indent pe o valoare Go: primește text JSON. Pentru valori folosește MarshalIndent.

Comenzi înrudite

  • encoding/json.MarshalIndent: Ca Marshal, dar scrie JSON-ul pe mai multe rânduri, indentat, ușor de citit (fișiere de configurare, afișare).
  • encoding/json.Valid: Verifică doar dacă textul este JSON valid, fără să-l citească într-o variabilă.
  • encoding/json.NewEncoder: Creează un Encoder care scrie JSON direct într-un io.Writer (răspuns HTTP, fișier, ecran); Encode scrie o valoare.