Функция json.MarshalIndent

Функция json.MarshalIndent преобразует переданное значение в JSON-строку с отступами и префиксами, делая вывод удобным для чтения человеком. В первый параметр передается значение, которое нужно сериализовать. Во второй параметр передается префикс (строка, добавляемая перед каждой строкой вывода). В третий параметр передается строка отступа (обычно пробелы или табуляция для вложенных структур). Функция возвращает байтовый срез и ошибку, если сериализация невозможна.

Синтаксис

gojson.MarshalIndent(v any, prefix, indent string) ([]byte, error)

Пример с простой структурой

Давайте сериализуем структуру с отступом в 2 пробела:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type User struct {
  Name string
  Age  int
}

func main() {
  u := User{Name: "Alice", Age: 30}
  res, err := json.MarshalIndent(u, "", "  ")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

Результат выполнения кода:

go{
  "Name": "Alice",
  "Age": 30
}

Пример с картой (map)

Сериализуем карту с отступом в виде табуляции:

gopackage main

import (
  "encoding/json"
  "fmt"
)

func main() {
  m := map[string]int{"a": 1, "b": 2, "c": 3}
  res, err := json.MarshalIndent(m, "", "\t")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

Результат выполнения кода:

go{
  "a": 1,
  "b": 2,
  "c": 3
}

Пример с префиксом

Добавим префикс ">>" перед каждой строкой вывода:

gopackage main

import (
  "encoding/json"
  "fmt"
)

func main() {
  data := []string{"a", "b", "c", "d", "e"}
  res, err := json.MarshalIndent(data, ">>", " ")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

Результат выполнения кода:

go>>[
>> "a",
>> "b",
>> "c",
>> "d",
>> "e"
>>]

Пример с вложенными структурами

Сериализуем вложенную структуру для наглядной демонстрации отступов:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Address struct {
  City  string
  Zip   int
}

type Person struct {
  Name  string
  Age   int
  Address Address
}

func main() {
  p := Person{
    Name: "Bob",
    Age:  25,
    Address: Address{
      City: "NY",
      Zip:  10001,
    },
  }
  res, err := json.MarshalIndent(p, "", "  ")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

Результат выполнения кода:

go{
  "Name": "Bob",
  "Age": 25,
  "Address": {
  "City": "NY",
  "Zip": 10001
  }
}

Смотрите также

  • функцию json.Marshal,
    которая выполняет сериализацию без форматирования
  • функцию json.Unmarshal,
    которая десериализует JSON в структуру или карту
  • функцию json.Indent,
    которая добавляет отступы к существующему JSON
  • функцию json.Valid,
    которая проверяет корректность JSON