Десериализовать один объект DateTime с помощью JsonConvert

Контекст

Строка JsonConvert.SerializeObject(DateTime.Now) дает следующий результат:

"2018-05-25T07:59:27.2175427+02:00"

Однако, когда я пытаюсь десериализовать эту строку JSON в DateTime со строкой: JsonConvert.DeserializeObject<DateTime>("2018-05-25T07:59:27.2175427+02:00")

он выдает Newtonsoft.Json.JsonReaderException со следующим сообщением:

Unexpected character encountered while parsing value: 2. Path '', line 1, position 1.

Что еще я пробовал до сих пор

"2018-05-25T07:59:27"

вызывает такое же исключение

Вопрос

Имея строку datetime в сериализованном формате JSON, я хотел бы иметь переменную DateTime и правильное значение в ней. Как я могу выполнить эту задачу?

Если Serialize может использовать значение по умолчанию, то для Deserialize следует использовать то же значение по умолчанию.

g.pickardou 25.05.2018 08:26

Строковый литерал JSON должен быть заключен в кавычки, поэтому вам нужно выполнить JsonConvert.DeserializeObject<DateTime>("\"2018-05-25T07:59:‌​27.2175427+02:00\"")‌. Цитаты для строкового литерала C# (которые являются частью JSON нет) легко спутать с кавычками, которые необходимо включить в строку JSON. См. dotnetfiddle.net/TgQ2cl

dbc 25.05.2018 08:29

Спасибо, попробовал работает. Это настоящий ответ. Вы должны опубликовать это. (Теперь я вспоминаю, как однажды я усвоил тот же урок :-), но похоже, что повторение - мать всех знаний.)

g.pickardou 25.05.2018 08:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
855
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что JsonConvert.DeserializeObject выглядит так, как будто ему нужен JSON объект, а не просто JSON значение. (Жаль, что SerializeObject не всегда создает объект, но ...)

Вы можете разобрать это так:

DateTime dt = new JValue("2018-05-25T07:59:27.2175427+02:00").ToObject<DateTime>();

Или (эквивалентно? Я не совсем уверен):

DateTime dt = (DateTime) new JValue("2018-05-25T07:59:27.2175427+02:00");

Возможно, есть лучший способ сделать это, но он, по крайней мере, работает.

Ответ принят как подходящий

Как показано в Стандарт JSON, строковый литерал JSON должен быть заключен в кавычки:

A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.

Таким образом, чтобы быть допустимым JSON, строковый литерал C# должен включать окружающие двойные кавычки, например:

var dateTime = JsonConvert.DeserializeObject<DateTime>("\"2018-05-25T07:59:27.2175427+02:00\"");

Очень легко спутать самые внешние кавычки, которые являются частью языка C# и ограничивают строку в вашем коде C#, но не включены в саму строку, с внутренними кавычками, которые являются частью самого строкового литерала.

Пример скрипки здесь.

Другие вопросы по теме