Парсинг - продолжаем (DateTimeOffset)

  • Михаил
  • 8 мин. на прочтение
  • 5
  • 06 Feb 2026
  • 06 Feb 2026

Чтобы явно задать формат строки для парсинга DateTimeOffset при десериализации JSON в System.Text.Json, используйте JsonConverter. Это позволит вам контролировать, как строка преобразуется в DateTimeOffset.

Пример: Кастомный конвертер для DateTimeOffset

1. Создайте кастомный конвертер:

using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
public class CustomDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
   private const string ExpectedFormat = "yyyy-MM-ddTHH:mm:ssK"; // или другой формат, если нужно
   public override DateTimeOffset Read(
       ref Utf8JsonReader reader,
       Type typeToConvert,
       JsonSerializerOptions options)
   {
       string dateString = reader.GetString();
       return DateTimeOffset.ParseExact(
           dateString,
           ExpectedFormat,
           CultureInfo.InvariantCulture,
           DateTimeStyles.None
       );
   }
   public override void Write(
       Utf8JsonWriter writer,
       DateTimeOffset value,
       JsonSerializerOptions options)
   {
       writer.WriteStringValue(value.ToString(ExpectedFormat));
   }
}

2. Примените конвертер к свойству или типу:

public class Order
{
   [JsonConverter(typeof(CustomDateTimeOffsetConverter))]
   public DateTimeOffset Timestamp { get; set; }
   // Другие поля...
}

3. Десериализуйте с учётом конвертера:

var options = new JsonSerializerOptions
{
   Converters = { new CustomDateTimeOffsetConverter() },
   PropertyNameCaseInsensitive = true,
};
var order = JsonSerializer.Deserialize<Order>(json, options);

Зачем это нужно:

  • Если формат времени в JSON не строго ISO 8601 или требуется валидация.
  • Если нужно поддерживать несколько форматов или специфичные случаи.

Примечания:

  • Если формат в JSON всегда ISO 8601 (например, "2026-02-05T16:02:40+03:00"), то кастомный конвертер не обязателенSystem.Text.Json справится автоматически.
  • Если формат отличается (например, без секунд или с другим разделителем), конвертер позволит задать точный шаблон.