исходный вопрос:
Мне известна проблема при десериализации значений даты в строках 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);
Код: Выделить всё
?moDataSet.Tables[0].Columns[0].DataType.Name
И в этом проблема.
Если вы используете Пример 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
Код: Выделить всё
?moDataSet.Tables[1].Rows[0]["DATER"]
Код: Выделить всё
"02/16/2026 11:17:43"
Таким образом, проблема здесь в том, что в исходном подходе 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
Мобильная версия