Перейти к основному содержимому

Язык, на котором говорят API

API обмениваются данными в формате JSON — это текст вида {"id": 1, "name": "Ana"}. Пакет encoding/json в Go переводит в обе стороны: Marshal превращает структуру в JSON, а Unmarshal заполняет структуру из JSON.

Теги структуры связывают эти два мира: тег `json:"name"` сопоставляет экспортируемое поле Name в Go с ключом JSON в нижнем регистре. Переводятся только экспортируемые поля (те, что начинаются с заглавной буквы).


От структуры к JSON

json.Marshal выдаёт компактный JSON для машин, а json.MarshalIndent — читаемый JSON для людей и логов. Опция тега omitempty убирает поля, которые содержат нулевое значение.

Marshal: с отступами и компактно

У Ana нет email, и omitempty полностью убирает пустое поле из её JSON. Полная запись Ben выводится с отступами.

Prompt
Напишите программу на Go со структурой User, использующей json-теги и опцию omitempty для поля email. Преобразуйте в компактный JSON пользователя без email, а полного пользователя — с помощью MarshalIndent, и выведите оба результата.
Вывод: программа на Go и захваченный вывод

От JSON к структуре

json.Unmarshal разбирает JSON в структуру, которую вы передаёте (в виде указателя). Неизвестные ключи JSON просто игнорируются, а для отсутствующих ключей остаётся нулевое значение. Возвращаемая ошибка — единственный признак того, что JSON был некорректным, поэтому всегда проверяйте её.

Unmarshal и проигнорированный лишний ключ

В JSON есть ключ extra, которого нет в структуре, — ошибки не будет, он просто пропускается. А вот испорченный JSON возвращает настоящую ошибку.

Prompt
Напишите программу на Go, которая разбирает JSON-строку с лишним неизвестным ключом в структуру User и выводит заполненную структуру, а затем пытается разобрать испорченный JSON и выводит ошибку.
Вывод: программа на Go и захваченный вывод

Вложенные данные

Реальные данные API вложены друг в друга: заказ содержит своего пользователя и список товаров. Структуры внутри структур и срезы автоматически превращаются в объекты и массивы JSON — никакой особой обработки не нужно.

Заказ с пользователем внутри

Вложенная структура User становится вложенным объектом JSON, а срез товаров — массивом JSON: форма данных в Go и есть форма JSON.

Prompt
Напишите программу на Go со структурой Order, содержащей ID, срез с названиями товаров и вложенную структуру User, — всё с json-тегами. Преобразуйте один заказ с помощью MarshalIndent и выведите результат, чтобы показать вложенные объекты и массивы.
Вывод: программа на Go и захваченный вывод