Приходилось ли работать с форматами XML и JSON для обмена данными?
Что проверяют
Знаете ли вы стандартные пакеты и их острые углы: теги, указатели, потоковый разбор. Формально вопрос про опыт, но дальше пойдут уточнения, на которых видно, писали ли вы что-то сложнее json.Marshal структуры из трёх полей.
Как отвечать
Основа это encoding/json и encoding/xml, оба работают через теги структур и только с экспортируемыми полями.
type Product struct {
XMLName xml.Name `xml:"product" json:"-"`
ID int64 `json:"id" xml:"id"`
Name string `json:"name" xml:"name"`
Price string `json:"price,omitempty" xml:"price"`
}Дальше назовите то, что реально встречается в работе:
- отличить отсутствующее поле от нулевого значения умеет только указатель или
json.RawMessage,omitemptyэту задачу не решает; - строгий разбор входа включается через
Decoder.DisallowUnknownFields; - крупный документ разбирается потоково через
Decoder, а не грузится целиком в память; - числа в
map[string]anyстановятсяfloat64, поэтому для идентификаторов и сумм нуженUseNumberили свой тип; - собственная логика вешается на
MarshalJSONиUnmarshalJSON.
Про XML честно скажите, что пакет заметно беднее: карты он не сериализует, поддержка пространств имён ограничена, а сложную схему часто проще разобрать вручную через Decoder.Token.
Где спотыкаются
Молчаливые ошибки в тегах. Поле с маленькой буквы в вывод не попадёт, а опечатка в теге, вроде пробела после двоеточия, просто игнорируется. Ловится это go vet, а не тестом на счастливый путь.
Забывают про экранирование. По умолчанию маршалер экранирует символы, опасные для HTML, и вместо амперсанда в выводе появляется escape-последовательность. Отключается это только через энкодер с отдельной настройкой, и партнёр, который сверяет байты, узнает об этом раньше вас.
Хранят деньги в float64. К формату обмена это отношения не имеет, но всплывает именно на сериализации: сумма уходит с расхождением в копейку, и виноватым назначают JSON. Строка или целое число копеек закрывают вопрос.