Как запретить десериализатору JSON конвертировать значение даты в DataSet, когда первая строка равна NULLC#

Место общения программистов C#
Ответить
Anonymous
 Как запретить десериализатору JSON конвертировать значение даты в DataSet, когда первая строка равна NULL

Сообщение Anonymous »

Мне известна проблема при десериализации значений даты в строках JSON, представляющих System.DataSet, когда первая строка содержит NULL.
Сравните две строки:

Код: Выделить всё

"{\"Table1\":[{\"DATER\":\"2026-02-16T11:17:43.803\"}]}"
"{\"Table1\":[{\"DATER\":null},{\"DATER\":\"2026-02-16T11:17:43.803\"}]}"
Итак, вот несколько примеров использования:

Код: Выделить всё

string sTest;
System.Data.DataSet moDataSet = null;
//Example 1 - Skip the line in Example 2 if you want to try this one
sTest = "{\"Table1\":[{\"DATER\":\"2026-02-16T11:17:43.803\"}]}";
//Example 2
sTest = "{\"Table1\":[{\"DATER\":null},{\"DATER\":\"2026-02-16T11:17:43.803\"}]}";
Newtonsoft.Json.JsonSerializerSettings oSettings = new Newtonsoft.Json.JsonSerializerSettings();
oSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
moDataSet = Newtonsoft.Json.JsonConvert.DeserializeObject((string)sTest, (Newtonsoft.Json.JsonSerializerSettings)oSettings);
Чтобы воспроизвести проблему, выполните код и после оператора, в котором он десериализует строку в System.Data.DataSet, запросите тип данных первого столбца, введя следующее в окно интерпретации вашей IDE:

Код: Выделить всё

?moDataSet.Tables[0].Columns[0].DataType.Name
Это покажет вам, какой тип данных имеет столбец "DATER" в десериализованном System.Data.DataSet.
И в этом проблема.
Если вы используете Пример 1, он сообщит вам, что тип данных для столбца DATER - "DateTime".
Если вы используете Пример 2, он скажет вам, что тип данных для столбца DATER
равен "Строка"
но также, если вы затем запросите содержимое строки данных с ненулевым значением, которое будет строкой 0 в первом примере и строкой 1 во втором примере, вы найдете следующее:
Пример 1:

Код: Выделить всё

?moDataSet.Tables[0].Rows[0]["DATER"]
Это даст вам значение даты, которое позволит вам запросить все соответствующие значения даты. Вывод в окне интерпретации выглядит следующим образом:

Код: Выделить всё

{16 Feb 2026 11:17:43}
Date: {16 Feb 2026 00:00:00}
Day: 16
DayOfWeek: Monday
DayOfYear: 47
Hour: 11
Kind: Unspecified
Millisecond: 803
Minute: 17
Month: 2
Second: 43
Ticks: 639068374638030000
TimeOfDay: {11:17:43.8030000}
Year: 2026
Пример 2:

Код: Выделить всё

?moDataSet.Tables[1].Rows[0]["DATER"]
Это даст вам строковое значение. В окне немедленного просмотра вы увидите следующее:

Код: Выделить всё

"02/16/2026 11:17:43"
Немного предыстории этой проблемы также может помочь вам понять, с чем мы столкнулись. У нас есть довольно старое приложение, которое использовало OLEDB для извлечения данных непосредственно в переменные System.Data.DataSet. Мы не в состоянии переписать приложение с нуля, поэтому мы создали «оболочку», которая позволяет приложению также, в зависимости от «параметров конфигурации», использовать вместо этого REST API. Оболочка преобразует выходные данные JSON REST API в объекты System.Data.DataSet, которые приложение затем может использовать так же, как оно всегда это делало.
Таким образом, проблема здесь в том, что в исходном подходе OLEDB System.Data.DataSet всегда возвращал DATER как DateTime, и затем мы просто устанавливали переменные типа «Дата» в возвращаемое значение.
Теперь, если приложение использует REST API, оно может возвращать DATER как строка. И то, что мы делаем в приведенном выше примере, приводит к изменению значения DATER во второй строке с «2026-02-16T11:17:43.803» в JSON на строку «16.02.2026 11:17:43» в столбце DATER во второй строке в DataSet.
Мой опыт в сериализации и десериализации JSON очень плох. отсутствие чего также не позволяет мне легко найти здесь «похожие вопросы» или «дубликаты». Я надеюсь, что кто-нибудь сможет дать мне простое решение для вызова DeserializeObject, которое не позволит ему изменить формат строки DATER во втором примере

Подробнее здесь: https://stackoverflow.com/questions/798 ... t-when-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»