Использование JsonConverter для сохранения всех значений даты и времени одинаковыми - PullRequest
0 голосов
/ 19 мая 2018

У меня есть вариант использования, в котором ВСЕ значения даты / времени должны быть сохранены в документах JSON в следующем формате:

yyyy-MM-ddTHH:mm:ss.fffffff

Другими словами, все значения даты / времени будут ровно 27 символов вдлина независимо от значения даты / времени, например:

System.DateTime.MinValue = "0001-01-01T00:00:00.0000000"
System.DateTime.MaxValue = "9999-12-31T23:59:59.9999999"
19-May-2018 10:35:12 am  = "2018-05-19T10:35:12.0000000"

К сожалению, Json.Net принимает решение отформатировать дату / время в различных форматах в зависимости от значения даты / времени.Я попытался использовать атрибут JsonConverter для свойств даты / времени, а именно:

[JsonConverter( typeof( datetime_iso8601_converter ) )]
public System.DateTime created_utc;

Мой класс преобразователя выглядит следующим образом:

public class datetime_iso8601_converter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{

   public datetime_iso8601_converter()
   {

      // Set format that all DateTime values will use ...

      base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";

   }

}

Если я запускаю тест с использованием отладчика,например:

created_utc = System.DateTime.MinValue;

Я вижу, что следующая строка выполнена:

base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";

Однако полученное записанное значение даты / времени JSON:

"0001-01-01T00:00:00"

ВТОРАЯ ПОПЫТКА:

Я попробовал следующий конвертер ...

public class datetime_iso8601_converter : Newtonsoft.Json.Converters.DateTimeConverterBase
{

   // The format that all datetime values will use ...

   private const String k_fmt_datetime_iso8601 = "yyyy-MM-ddTHH:mm:ss.fffffff";

   // Write the given datetime value using the format above ...

   public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
   {

      if ( value is System.DateTime )
      {

         String dt_str;

         System.DateTime dt;

         dt = ( System.DateTime ) value;

         dt_str = dt.ToString( k_fmt_datetime_iso8601 );

         writer.WriteRawValue( dt_str );

      }
      else
      {

         throw new ArgumentException( "value is not System.DateTime" );

      }

   }

   // Return a datetime value ...

   public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
   {

      if ( reader.TokenType != Newtonsoft.Json.JsonToken.Date )
      {

         throw new Exception( "Invalid token. Expected Date" );

      }

      return reader.Value;

   }

}

Снова используя отладчик, я вижу, что dt_str установлено значение:

"0001-01-01T00:00:00.0000000"

, но записываемое значение:

"0001-01-01T00:00:00" 

Я не понимаю, почему.

КАК я могу получитьвсе значения даты / времени, сохраненные в требуемом формате?

Заранее спасибо.

1 Ответ

0 голосов
/ 21 мая 2018

Данная проблема присутствовала в среде, в которой использовались функции Azure.Текущий выпуск функций Azure 1.0.13, по-видимому, не поддерживает перенаправления привязки, то есть:

[JsonConverter( typeof( datetime_iso8601_converter ) )]

Однако версия 1.22.0 будет поддерживать JsonSettings и перенаправления привязки (надеюсь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...