У меня есть поле даты, которое не удается проанализировать. Серде не сообщает мне, какое поле не работает, что проблематично, потому что это поле на самом деле находится на многих уровнях в моей реальной полезной нагрузке JSON, и потребовалось немного двоичного поиска, чтобы выяснить, что на самом деле это поле даты, которое на самом деле было неудачно.
Другими словами, ошибка serde не сообщает мне, какое поле не удалось проанализировать в допустимом JSON. Как я могу это сделать?
На самом деле это полностью говорит вам, откуда возникает ошибка. На вашей игровой площадке это строка 1, столбец 19, т. е. в конце строки "2024-1-1"
.
@jmb, отсюда понятно, откуда это взялось, потому что создал репозиторий MVP. Фактическая полезная нагрузка, о которой идет речь, легко имела глубину 5 уровней и более 100 полей. Мой вопрос не в том, «почему это не удается», а в том, «как я могу заставить serde сообщить мне, какое поле не удалось проанализировать».
Это не имеет ничего общего с тем, что это MRE, а связано с сообщением об ошибке Serde: «Ошибка («Преждевременное завершение ввода», строка: 1, столбец: 19)». В вашей реальной полезной нагрузке вы можете получить огромные номера строк/столбцов, но любой приличный текстовый редактор способен перейти к заданной позиции и показать вам не только поле, вызвавшее ошибку, но и фактический символ, в котором произошла ошибка.
В нашем случае строка/столбец всегда означала конец полной полезной нагрузки верхнего уровня. Строка/столбец не представляла достоверной информации в реальной коллекции структур.
Вы можете использовать serde_path_to_error, чтобы добавить информацию о местоположении к любой ошибке десериализации.
(Сам я им не пользовался, но видел, что его рекомендовали, и он написан тем же автором, что и сам сериал, Дэвидом Толнаем.)
Это кажется хорошим решением. Спасибо за ссылку!
Если вы признаете ошибки, то это как бы говорит, откуда они. Это
chrono
ошибка. Поскольку"2024-1-1"
являетсяDate
, а неDateTime
, его анализ какDateTime
приводит к ошибкеpremature end of input
. Есть различные способы обойти это. В целом, если вы хотите больше описательных ошибок, вам нужно использоватьdeserialize_with
, а затемmap_err()
для создания более описательных ошибок.