Skip to content

Преобразование данных в JSON

Чтобы преобразовать данные в JSON из подходящей структуры данных, мы используем функцию json.Marshal, предоставляемую пакетом json. Эта функция имеет следующий синтаксис.

Мы можем использовать struct или map объект в качестве аргумента v функции Marshal( для кодирования данных из JSON). Эта функция возвращает слайс байтов, который представляет собой не что иное, как данные JSON в кодировке UTF-8 и ошибку, если объект v не может быть преобразован в JSON как строка по каким-либо причинам.

Давай создадим простой struct и преобразуем в JSON.

Пришло время поработать с кодом!

В приведенной выше программе мы объявляем тип структуры Student с несколькими полями разных типов данных. В функции main мы создали структуру john и инициализировали все поля Student, кроме поля Email.

Позже мы передаем структуру john в функцию json.Marshal, и она должна возвращать данные JSON в виде фрагмента байтов. Поскольку мы хотим вывести johnJSON в виде строки, мы использовали преобразование типов в функции Println. Эта программа при запуске выдает следующий результат.

Если ты хочешь отформатировать JSON с новыми строками и отступами, ты можешь использовать функцию json__.MarshalIndent, которая внутренне вызывает функцию Marshal__. Эта функция принимает префикс и отступ в качестве аргумента.

Если мы посмотрим на приведенный выше результат, мы можем заметить неверный формат названий полей. Прежде всего, функция Marshal рассматривает имя поля структуры как ключ элемента JSON, что может быть удобно, но в большинстве случаев нам нужны настраиваемые имена полей в данных JSON. Имена полей в стиле camel case не соответствуют формату.

Несмотря на то, что значение поля Email не было присвоено john, оно попало в JSON. Это происходит из-за того, что нулевое значение string является пустой строкой (“”) и у функции Marshal нет способа узнать, следует ли его игнорировать, но мы исправим это позже.

Но еще хуже, что в JSON попали только имена полей, начинающиеся с заглавной буквы. Это происходит из-за того, что функция Marshal учитывает только экспортированные поля для кодировки.

Мы также можем преобразовывать тип данных map в данные JSON. Необходимым условием является то, что ключи map должны быть или string, или int. Если ключ является целым числом, для кодирования map он будет приведен к string.

Пришло время поработать с кодом!

В приведенном выше примере мы объявили Student типа map, ключи которого являются строками, а значения могут быть любого типа данных. Позже мы заполнили map john несколькими парами key:value , заимствованными из предыдущего примера.

Эта программа при запуске дает следующий результат.

На этот раз нам не пришлось беспокоиться об удалении каких-либо полей из JSON, поскольку мы используем map для кодирования данных. Вы можете подумать, что map — это хороший способ кодирования JSON, однако struct дает больше возможностей.