encoding

Пакет encoding определяет интерфейсы, общие для других пакетов, которые преобразуют данные в байтовые или текстовые представления и обратно. Пакеты, которые проверяют эти интерфейсы, включают например encoding/json и encoding/xml. В результате однократная реализация интерфейса может сделать тип полезным в нескольких форматах. Стандартные типы, реализующие эти интерфейсы, включают time.Time и net.IP.

encoding/json

Пакет encoding/json реализует кодирование и декодирование для формата JSON, описанного в RFC7159.Давайте рассмотрим основные функции этого пакета.

Marshal

func Marshal(v interface{}) ([]byte, error)

Функция Marshal возвращает

  1. слайс байт, содержащий текстовое представление в формате JSON объекта, переданного в функцию
  2. ошибку, если она встретилась в процессе преобразования

Вот таблица соответствия между типами данных Golang и JSON.

Untitled

Для того, чтобы представить структуру как JSON, нужно использовать специальные теги:

// Это поле структуры будет представлено в JSON объекте как "myName"
Field int `json:"myName"`

// То же самое, что и в предыдущем примере, только если поле пустое, то его не будет в JSON объекте.
Field int `json:"myName,omitempty"`

// Если не указать название поля, то будет использовано имя по умолчанию - "Field"
Field int `json:",omitempty"`

// Поле будет проигнорировано при сериализации этой структуры.
Field int `json:"-"`

// Поле будет представлено с ключом "-"
Field int `json:"-,"`

// Если указать опцию string, то поле будет представлено как UTF-8 строка JSON.
Int64String int64 `json:",string"`

Обратите внимание, что поля должны быть публичными, то есть иметь имя начинающееся с буквы верхнего регистра! В противном случае они будут проигнорированы в процессе сериализации.

Unmarshal

func Unmarshal(data []byte, v interface{}) error

Функция Unmarshal разбирает предоставленный слайс байт data в объект, переданный вторым аргументом. Возвращает ошибку, если она произошла в процессе разбора данных. Обычно вторым объектом передается указатель на тот или иной объект.

Если попытаться разобрать объект в интерфейс, то пакет будет использовать следующее соответствие типов JSON типам Golang:

Untitled

Для более полного ознакомления с особенностями работы с JSON в Golang рекомендуем ознакомиться с этой статьей.