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





Проблема в том, что 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
stringis 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#, но не включены в саму строку, с внутренними кавычками, которые являются частью самого строкового литерала.
Пример скрипки здесь.
Если Serialize может использовать значение по умолчанию, то для Deserialize следует использовать то же значение по умолчанию.