Dart и ASP.NET ядро ​​несовместимо с разбивкой на доли секунды ISO-8601 - PullRequest
0 голосов
/ 30 мая 2019

Очевидно, что при использовании объектов DateTime в ядре ASP.NET JSON.Net сериализует их с точностью до 7 цифр.

Пример:

 "registrationDate": "2019-05-30T09:21:05.1676144-04:00",

или

    "registrationDate": "2019-05-30T15:34:04.0929048Z",

In Dart Pad:

 var t = DateTime.parse('2019-05-30T15:34:04.0929048Z');

Выходы:

Uncaught exception:
FormatException: Invalid date format
2019-05-30T15:34:04.0929048Z

но когда я урежу последнюю цифру ('8'):

 var t = DateTime.parse('2019-05-30T15:34:04.092904Z');

дает:

2019-05-30 15:34:04.093Z

При использовании их в Dart из API, Dart принимает только шесть цифр точности и выдает ошибку, когда встречает 7-ю цифру.

Вот ссылка на документы Dart: https://api.dartlang.org/stable/2.3.1/dart-core/DateTime/parse.html

Вот соответствующий код из их документов:

  int parseMilliAndMicroseconds(String matched) {
     if (matched == null) return 0;
     int length = matched.length;
     assert(length >= 1);
     assert(length <= 6);

Маловероятно, что в ближайшее время будет какое-то исправление на стороне Дартс, поскольку это довольно фундаментальная библиотека.

Итак, кто-нибудь может мне сказать, как заставить мой ASP.NET Core API снизить точность на одну цифру? Эти даты везде в системе, и было бы здорово, если бы я мог просто изменить форматированный вывод из одного места.

Я думаю, что альтернативой было бы написать JsonConverter, но я действительно не хочу делать это для каждого класса.

Идеи

ТИА

1 Ответ

0 голосов
/ 31 мая 2019

Кажется, есть два подхода, один - использовать CustomContractResolver из Json.Net.Я не преследовал это, потому что мне пришло в голову, что мне могут понадобиться эти семь цифр для сравнения в других местах, которые не были ограничены, как Дарт.

Так что вместо этого я использовал JsonConverter.Вот код:

public class DartDateTimeConverter : IsoDateTimeConverter
{
    public DartDateTimeConverter()
    {
        DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFK";
    }
}

Обратите внимание, что позиции 'F' имеют длину всего 6.

Я взял это непосредственно из другого примера SO .

Затем я обновил свой объект передачи данных, добавив связанный атрибут:

[JsonConverter(typeof(DartDateTimeConverter))]
[JsonProperty("registrationDate")]
public DateTime RegistrationDate { get; set; }

Надеюсь, это кому-нибудь поможет.

...