Какой формат данных выбрать для клиента: JSON, YAML или XML и почему
Что проверяют
Выбираете ли вы формат от потребителя данных, а не по привычке, и знаете ли, как каждый из них ведёт себя в Go. Следом обычно спрашивают про encoding/json: теги, неизвестные поля, числа и производительность.
Как отвечать
Сначала уточните, кто клиент: браузер или мобильное приложение, другой сервис, человек с конфигом в редакторе или старая интеграция. От этого зависит ответ:
- JSON: стандарт для HTTP API и фронтенда. В Go работает из стандартной библиотеки
encoding/json, поля размечаются тегами видаjson:"name,omitempty". Слабые места: нет комментариев, нет типа для дат, аint64больше 2^53 JavaScript читает с потерей точности, поэтому идентификаторы часто отдают строкой (опция тега,string); - YAML: формат для людей: конфиги сервиса, манифесты Kubernetes, пайплайны CI. Есть комментарии, якоря, многострочные строки. В стандартной библиотеке его нет, нужна сторонняя, обычно семейства
yaml.v3. Для API клиенту он не подходит: парсинг медленнее, а ошибка в отступе молча меняет структуру; - XML: когда этого требует вторая сторона: SOAP, банковские и государственные интеграции, документы со схемой XSD. В Go есть
encoding/xml, атрибуты размечаются через,attr, но с пространствами имён он работает неудобно.
Хорошо добавить, что для обмена между своими сервисами под нагрузкой часто берут Protobuf через gRPC: строгая схема, компактный бинарный формат, генерация кода. Итог короткий: клиенту API отдаём JSON, конфиг для человека пишем в YAML, XML берём только по требованию контрагента.
Где спотыкаются
Предлагают YAML для API «потому что читабельнее». Браузеру он не родной, а неявная типизация превращает 0.10 в число 0.1, а по правилам YAML 1.1 ещё и no в false.
Не знают поведения encoding/json: неэкспортируемые поля не сериализуются, неизвестные поля во входящем JSON молча отбрасываются, пока не вызвать DisallowUnknownFields() у json.Decoder, а числа при декодировании в any становятся float64.
Называют XML мёртвым форматом. В интеграциях с банками и госсистемами он обязателен, и умение валидировать документ по XSD там ценится.