[БЕЗ_ЗВУКА] Здесь давайте поговорим про json.
json — это де факто стандарт передачи данных между
client-side и server-side в современном вебе.
Конечно, в go имеется встроенный упаковщик и распаковщик go, json,
и процесс упаковки-распаковки вообще каких-либо
данных в go называется маршалингом и анмаршалингом.
Давайте посмотрим, как это работает.
Итак, у нас есть программа.
Мы для начала импортируем вообще пакет для работы с json.
Есть какая-то структура пользователь: Id, Username, телефон.
Есть запакованный json, в котором есть эти поля.
И теперь мы хотим распаковать.
Что мы делаем?
Для начала мы преобразуем эту строку с json к слайсу byte,
Дело в том, что распаковщик, он работает со слайсом byte, не со строками.
Дальше мы создадим юзера, для начала пустого,
а теперь вызовем функцию json.Unmarshal,
которая принимает слайс byte, в котором должен лежать json,
и переменную, куда нам нужно записать результат.
И выведем.
После этого я хочу изменить телефон у этой структуры и обратно запаковать ее.
Для этого есть функция Marshal.
То есть я вызываю функцию Marshal из пакета json и передаю туда структуру.
Она мне возвращает ошибку и результат.
Давайте все-таки ошибку будем явно обрабатывать, не надо учиться плохому.
[ЗВУК] [ЗВУК] Вот.
Ну и запустим.
Я успешно распаковал структуру, то есть появился User(ID:42,
Username: "rvasily" и почему-то пустой телефон.
При этом, когда я запаковал структуру, там вообще нет поля «телефон».
Почему так происходит?
Посмотрим еще раз на нашу структуру.
Поле «телефон», оно приватное, оно начинается с маленькой буквы.
То есть доступ к этому полю могут иметь только те методы,
те функции, которые объявлены в том же самом пакете, в котором и эта структура.
А у меня пакет main.
Соответственно, пакет encoding/json не может иметь к ним доступа и
он не может туда ни записать данные, ни прочитать оттуда данных при запаковке.
Имейте это в виду.
В предыдущем видео мы видели, что я упаковываю
и запаковываю поля с каким-то определенным именем.
А что, если вдруг мне надо сменить это имя,
при этом я не хочу менять имя структуры?
Для этого тоже есть способ.
В go у структур
может быть какая-то метаинформация, это называется тегами структуры.
Объявляется это вот так,
в бэктиках после определения
типа поля структуры.
И тут мы можем написать: json, то есть к какому...
ну какой-то префикс, к чему это относится.
json.
Первым полем json ожидает увидеть имя,
с которым мы будем работать, то есть либо из которого ему нужно распаковывать,
либо в который ему нужно записывать.
И дальше — тип данных, в который он должен записать этот тип.
Какие еще есть примеры?
Вот поле Address.
Тут идет сначала запятая, это значит,
что имя как было, так и остается, я не хочу его переопределять,
ну а дальше идет поле, называется omitempty, это значит,
что если поле пустое, там, например, значение по умолчанию,
то его не нужно писать в результат при запаковке.
Минус, он же дефис, означает, что поле вообще не нужно
сериализовывать и десериализовывать при json.
Итак, когда мы познакомились с тэгами структур, нужно что-то записать.
Я создал юзера, у него ID:42, Username, адрес, компания.
И теперь запакуем.
Надо посмотреть, что получилось.
[ЗВУК] Итак,
я запаковал нашу структуру через "user_id"
: "42" и "Username" : "rvasily".
Другие поля, они вообще не фигурируют в результатах.
Еще раз, почему это произошло.
У меня есть поле ID, оно является типом int,
однако я говорю, что его нужно сериализовать,
используя ключ "user_id" и сериализовать это, как строку.
Username я сериализую, как есть.
Address.
Адрес не надо сериализовать, если он пустой.
Компанию вообще не надо сериализовать никогда.
Если я напишу в адресе что-то, то он должен сериализоваться.
Запустим еще раз.
И теперь у нас появился адрес, потому что это не пустое поле.
С тегами структуры вы будете сталкиваться очень часто.
Не только json имеет свои теги, но и очень много других пакетов.