Как я могу ограничить формат даты в JSON.Net? - PullRequest
0 голосов
/ 29 октября 2018

Я хочу отклонить входящие тела запросов JSON с датами, используя формат времени UTC (чтобы устранить неоднозначность из-за часовых поясов), используя JSON.Net. Я рассмотрел следующие варианты, но безуспешно:

  • Я посмотрел на JsonSerializerSettings, и я не могу найти комбинацию параметров DateFormatString, DateFormatHandling, DateParseHandling и DateTimeZoneHandling, которые активно ограничивают такие запросы. Я был бы счастлив, если бы было решение, использующее эти опции, которое отклонило бы входящие даты в неправильном формате.
  • Я также изучал создание пользовательского JsonConverter (используя JsonConverter или DateTimeConverterBase); однако тип JsonToken это Date, а reader.Value уже является объектом DateTime, поэтому я не могу проверить предоставленную строку (или, если есть способ, я ее пропускаю).

Я надеюсь, что кто-то знает, как проверить десериализацию объекта даты JSON, прежде чем он автоматически преобразуется в объект DateTime, и может помочь мне.

1 Ответ

0 голосов
/ 29 октября 2018

Одним из способов является комбинированная установка DateParseHandling, чтобы не преобразовывать строку DateTime, а затем пользовательский JsonConverter для DateTime

Очень простой конвертер даты и времени, который собирается взорваться, если это не время в формате UTC, может быть

    public class DateTimeConverter : JsonConverter<DateTime>
    {
        public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
        {
            writer.WriteValue(value.ToString("u"));
        }

        public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            string s = (string)reader.Value;
            return DateTime.ParseExact(s,"u", CultureInfo.InvariantCulture);
        }
    }

тогда ваш код десериализации будет выглядеть так:

        var settings = new JsonSerializerSettings()
        {
            DateParseHandling = DateParseHandling.None,
            Converters = new List<JsonConverter>()
            {
                new DateTimeConverter()
            }
        };

        var deserialized = JsonConvert.DeserializeObject<MyDate>(json, settings);
...