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

Место общения программистов 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\"}]}"
Установив строковую переменную moData в одну из этих строк, я могу десериализовать ее в набор данных:

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

System.Data.DataSet moDataSet = null;
Newtonsoft.Json.JsonSerializerSettings oSettings = new Newtonsoft.Json.JsonSerializerSettings();
oSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
moDataSet = Newtonsoft.Json.JsonConvert.DeserializeObject((string)moData);
Когда я использую первую строку, столбец будет правильно введен:

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

{DATER}
AllowDBNull: True
AutoIncrement: False
AutoIncrementSeed: 0
AutoIncrementStep: 1
Caption: "DATER"
ColumnMapping: Element {1}
ColumnName: "DATER"
Container: Nothing
DataType: {Name = "DateTime" FullName = "System.DateTime"}
DateTimeMode: UnspecifiedLocal {3}
DefaultValue: {}
DesignMode: False
Events: {System.ComponentModel.EventHandlerList}
Expression: ""
ExtendedProperties: Count = 0
MaxLength: -1
[Namespace]: ""
Ordinal: 0
Prefix: ""
[ReadOnly]: False
Site: Nothing
Table: {Table1}
Unique: False
Во втором примере он видит «ноль» в первой строке, но не знает, что это тип даты, поэтому просто оставляет его как строку:

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

{DATER}
AllowDBNull: True
AutoIncrement: False
AutoIncrementSeed: 0
AutoIncrementStep: 1
Caption: "DATER"
ColumnMapping: Element {1}
ColumnName: "DATER"
Container: Nothing
DataType: {Name = "String" FullName = "System.String"}
DateTimeMode: UnspecifiedLocal {3}
DefaultValue: {}
DesignMode: False
Events: {System.ComponentModel.EventHandlerList}
Expression: ""
ExtendedProperties: Count = 0
MaxLength: -1
[Namespace]: ""
Ordinal: 0
Prefix: ""
[ReadOnly]: False
Site: Nothing
Table: {Table1}
Unique: False
Хотя существуют умные решения для решения этой проблемы, они были бы излишними для того, что мы пытаемся сделать. Нас бы вполне устроил тип «String» в DataSet, если бы не одна неприятная маленькая деталь. Когда я смотрю на содержимое столбца DATER во второй строке, оно теперь содержит следующую строку:

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

"02/16/2026 11:17:43"
И в этом проблема.
Почему, если он не может определить тип данных столбца, он все равно интерпретирует строку как значение «дата-время», а затем преобразует ее в формат «дд/ММ/гггг ЧЧ:мм:сс»? В исходном JSON его значение было «2026-02-16T11:17:43.803», и хотя теперь оно возвращается в виде строки, мы можем с этим справиться, поскольку оно в формате ISO, а локальные региональные настройки не имеют значения. Но мы не можем справиться с «16.02.2026 11:17:43»
Мне очень не хватает опыта в сериализации и десериализации JSON, что также не позволяет мне легко находить здесь «похожие вопросы» или «дубликаты». Я надеюсь, что кто-нибудь сможет дать мне простое решение для вызова DeserializeObject, которое не позволит ему изменить формат строки DATER во втором примере

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

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

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

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

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

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