Объект API имеет значение null, когда datetime передается через json

В настоящее время я пытаюсь создать запрос POST для создания заказа. Это отлично работает, если я поставлю свой json следующим образом:

  "Id": "A2EC1753-88DC-45E1-AD26-F887E0013323",
  "OrderType": "10",
  "Customer": "8111345C-95E3-460F-90FB-26E62E4265C4",
  "CustomerCode": "155542",
  "SubTotal": 417,
  "VatTotal": 0,
  "Total": 417,
 "Created": "2015-03-03T14:01:19.773+01:00",
  "Date": "2015-03-03T14:01:19.773+01:00",
.....

Но когда я указываю дату, которую отправляет мой клиент (гггг-мм-дд чч:мм:сс), т.е.:

"Id": "A2EC1753-88DC-45E1-AD26-F887E0013323",
  "OrderType": "10",
  "Customer": "8111345C-95E3-460F-90FB-26E62E4265C4",
  "CustomerCode": "155542",
  "SubTotal": 417,
  "VatTotal": 0,
  "Total": 417,
 "Created": "2019-04-26 16:53:39",
  "Date": "2019-04-26 16:53:39",
.....

Объект в моем контроллере возвращает null.

Created и Date имеют тип DateTime.

Что мне здесь не хватает?

Изменить:

Итак, клиент отправляет DateTime как гггг-ММ-дд ЧЧ:мм:сс. Очевидно, это не стандартная структура json для .Net.

В спецификации есть объекты, массивы, строки, целые числа и числа с плавающей запятой, но она не определяет стандарта того, как выглядит дата. Формат по умолчанию, используемый Json.NET, — это стандарт ISO 8601: «2012-03-19T07:22Z». До Json.NET 4.5 даты записывались в формате Microsoft: «/Date(1198908717056)/».15 фев. 2009 г.

Я попытался изменить его соответственно https://stackoverflow.com/a/49978720/7639883 и ответ ниже.

public void ConfigureServices(IServiceCollection services)
        {
            services.AddOData();
            services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // month must be capital. otherwise it gives minutes.
            }); 

            Setting.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
            services.AddDbContext<IsahContext>(
                options => options.UseSqlServer(Setting.ConnectionString)
            );
        }

Но почему-то до сих пор не работает.


person Falcon    schedule 08.05.2019    source источник
comment
Скорее всего, синтаксический анализ Json не снисходителен к формату. Есть ли причина, по которой вы не можете просто использовать первый формат?   -  person Lasse V. Karlsen    schedule 08.05.2019
comment
К сожалению, клиент является сторонним приложением, и я не могу его изменить.   -  person Falcon    schedule 08.05.2019


Ответы (1)


Для версий Core, использующих NewtonSoft.Json (т. е. до версии 3.0), может быть полезна эта статья: https://vikutech.blogspot.com/2017/01/handling-json-datetime-format-on-asp.net-core.html

Как описано в статье, чтобы направить преобразование Json, обрабатываемое классом Newtonsoft.Json.Converters.IsoDateTimeConverter, на использование пользовательского форматирования даты, в метод Configure следует добавить приведенный ниже код:

   services.AddMvc()  
   .AddJsonOptions(options =>  
   {  
     options.SerializerSettings.DateTimeZoneHandling = "MM/dd/yyyy HH:mm:ss";  
   });  
person Antti Kiiskinen    schedule 08.05.2019
comment
Спасибо посмотрю. Нужно ли добавлять эту часть в ConfigureServices (службы IServiceCollection)? - person Falcon; 08.05.2019
comment
Я чувствую, что вы правы, но почему-то это пока не работает. - person Falcon; 08.05.2019
comment
Было бы лучше перепечатать соответствующие детали в этом ответе, поскольку ответы только на ссылки не так уж полезны. Stack Overflow не стремится быть Google, он стремится быть тем, на что Google ссылается, и поэтому у нас должны быть ответы здесь. - person Lasse V. Karlsen; 08.05.2019
comment
Я немного обновил ответ, чтобы он содержал основную мысль статьи. Спасибо за совет @LasseVågsætherKarlsen! - person Antti Kiiskinen; 09.05.2019
comment
@Falcon Я думаю, что это должен быть способ изменить форматирование, извините, но у меня действительно нет других идей. Вы можете попробовать создать собственный фильтр в конвейере HTTP, который будет обрабатывать конверсии, но это слишком. И я не уверен, сможете ли вы зацепиться за процесс до того, как преобразование будет завершено. - person Antti Kiiskinen; 09.05.2019