JSON (нотация объектов JavaScript) — очень универсальный и очень популярный формат данных. Он часто используется для связи между веб-приложениями, а также как удобный способ хранения больших объемов структурированных данных приложений.

JSON настолько удобен, что практически все современные языки программирования имеют встроенную поддержку для работы с ним, в том числе и Go.

Работа с JSON в Go

Вы можете разделить большую часть работы, которую вы будете выполнять с JSON, на две основные категории: маршалирование и демаршалирование. Википедия определяет маршалинг как:

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

Проще говоря, маршалинг — это процесс преобразования данных, хранящихся в переменной, в форму, которую легче передать другой программе. Демаршалинг — это обратный процесс: он включает в себя получение данных, отформатированных для транспортировки, и преобразование их в форму, удобную для вашей программы.

Используя Go, вы можете маршалировать нативные структуры данных в JSON. И вы можете выполнить обратное действие, разобрав данные JSON в переменные Go.

Маршалинг в JSON в Go

Go предоставляет пакет кодирования/json чтобы вам было легко работать с JSON. Этот пакет содержит несколько функций, но та, которую вы будете использовать для маршалинга, — это Маршал функция. Маршал имеет следующую сигнатуру функции:

функц Маршал (v интерфейс{}) ([]байт, ошибка)

Это значит, что Маршал принимает параметр любого типа данных и возвращает два значения: срез байтов и ошибку. Другими словами, вы звоните Маршал со значением Go, преобразует его в JSON и возвращает эквивалент JSON. Если в процессе преобразования возникнет ошибка, он вернет ошибку и пустой фрагмент.

Вот пример кода, который использует Маршал конвертировать карту в JSON. Чтобы запустить этот пример, все, что вам нужно, это создать файл Go в ваш любимый редактор кода, или используйте Иди на детскую площадку:

упаковка основной

Импортировать (
"кодировка/json"
"ФМТ"
)

функция основной(){
val := карта[строка]инт{
"Джон": 25,
"Мэри": 19,
"Адам": 5,
}

разрешение, _ := json. Маршал (вал)
ФМТ.Println(нить(разрешение))
}

Если вы запустите этот код, он выведет следующее:

Как упоминалось ранее, вы можете маршалировать данные Go любого типа в JSON, хотя в реальной жизни вы обычно маршалингуете структуры. Из-за этого Go предоставляет функцию, называемую структурными тегами, которая позволяет вам дать Маршал дополнительные инструкции по преобразованию ваших структур.

Тег структуры — это строка, которую вы включаете в объявление структуры рядом с типом данных поля. Структурные теги позволяют настроить способ Маршал обрабатывает поле, которому принадлежит тег. Вы можете использовать теги структуры, чтобы переименовать поле в выводе JSON или даже полностью его опустить. Структурные теги (которые Маршал распознает) начните с подстроки «json:».

Например, скажем, у вас есть структура Машина который представляет некоторую информацию об автомобиле. Вот код для создания Машина и маршалировать его в JSON:

упаковка основной

Импортировать (
"кодировка/json"
"ФМТ"
)

функция основной(){
тип Структура автомобиля {
Строка бренда
Строка модели
Цена инт
}
val := Car{Марка: "Мерседес", Модель: "Бенц", Цена: 50000}
разрешение, _ := json. Маршал (вал)
ФМТ.Println(нить(разрешение))
}

Этот код производит вывод:

Бренд, Модель, и Цена поля Машина нужно начинать с заглавных букв или Маршал не сможет их преобразовать. Это приводит к тому, что поля вывода JSON также начинаются с прописных букв. Но что, если вы хотите, чтобы имена в JSON начинались со строчной буквы, или если вы хотите полностью переименовать поле? Вот тут-то и появляются структурные теги. Вот пример:

упаковка основной
Импортировать (
"кодировка/json"
"ФМТ"
)
функция основной(){
тип Структура автомобиля {
ID int `json:"-"`
Строка бренда `json:"тип"`
Строка модели `json:"модель"`
Цена в json:"цена"`
}
val := Car{ID: 0, Марка: "Мерседес", Модель: "Бенц", Цена: 50000}
разрешение, _ := json. Маршал (вал)
ФМТ.Println(нить(разрешение))
}

Этот код вводит новое поле идентификатора, которое Маршал исключается из вывода JSON через тег структуры. Код также использует теги структуры для переименования других полей структуры. Вот вывод программы:

Как видите, часть тега структуры, следующая за «json:», становится именем поля в выводе Marshal. Есть одно исключение: если это строка "-", Маршал пропускает это поле из вывода. Подробнее о тегах Marshal и struct можно прочитать в Перейти к документации.

Демаршалинг из JSON в Go

Пакет encoding/json также предоставляет функцию демаршалинга, называемую Демаршал. Он имеет следующую сигнатуру функции:

func Unmarshal (данные []byte, v интерфейс{}) ошибка

В отличие от Маршал, Демаршал не возвращает значение. Вместо этого он принимает JSON как фрагмент байтов в первом аргументе, а затем сохраняет преобразованные данные в объекте, на который указывает его второй аргумент. Демаршал работает и со структурными тегами, но здесь теги сообщают Демаршал какие поля JSON соответствуют каким полям структуры.

При демаршалинге в программе вы можете получить данные из API, но здесь вы будете использовать фиктивные данные. Вот как вы используете Демаршал:

упаковка основной

Импортировать (
"кодировка/json"
"ФМТ"
)

функция основной(){
тип Структура автомобиля {
ID int `json:"-"`
Строка бренда `json:"тип"`
Строка модели `json:"модель"`
Цена в json:"цена"`
}

jsonInput := `{
"тип": "Тойота",
"модель": "Камри",
"цена": 2000
}`

вар jsonВыходной автомобиль
ошибка := json. Демаршал([]байт(jsonInput), &jsonOutput)

если ошибка != ноль {
ФМТ. Распечатать("Ошибка декодирования JSON!")
возвращаться
}

ФМТ.Println(jsonвыход)
}

В этом коде используется тот же тип Car, что и в предыдущем примере, и он преобразует объект JSON в структуру типа Car, а затем печатает данные в структуре. При запуске программа выдает такой вывод:

Это показывает, что фиктивные данные JSON были успешно преобразованы в jsonвыход структура.

Go упрощает работу с JSON

С пакетом encoding/json работа с JSON в Go выполняется так же просто, как два вызова функций: Marsshaland Unmarshal. Go также позволяет настраивать процесс маршалинга/демаршалинга JSON с помощью тегов структуры.

Преобразование данных в JSON — отличный способ поделиться ими с другой программой или процессом. Формат настолько универсален, что JSON настолько переносим, ​​насколько это возможно.