Десериализация одного объекта DateTime с помощью JsonConvert - PullRequest
0 голосов
/ 25 мая 2018

Контекст

Строка 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 со следующим сообщением:

При анализе значения обнаружен неожиданный символ: 2. Path '', строка 1, позиция 1.

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

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

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

Вопрос

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

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

A string - это последовательность из нуля или более символов Юникода, заключенная в двойнойкавычки, используя обратную косую черту.Символ представляется в виде отдельной символьной строки.Строка очень похожа на строку C или Java.

enter image description here

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

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

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

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

0 голосов
/ 25 мая 2018

Проблема в том, что 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");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...