Веб-API ASP.NET Core 8 — JsonConverter<DateTime> неправильно преобразует DateTime

У нас есть приложение WEB API ASP.NET Core 8, которое использует традиционную N-уровневую архитектуру.

Репозиторий возвращает массив JSON:

string jsonArray = "[ 
    { 
        "id": 1,
        "createDate": "2024-05-30T15:46:45"
    }
        
]"

Модель этого JSON выглядит следующим образом:

public class FooBar
{
    public int Id { get; set; }
    public DateTime CreateDate { get; set; }
}

Прочитав этот пост, я написал следующий конвертер:

public class DateTimeJsonConverter : JsonConverter<DateTime>
{
    public override DateTime Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options) 
    {
            if (typeToConvert == typeof(DateTime))
            {
                return DateTimeHelper.Parse(reader.GetString());
            }
            
            throw new ArgumentException("It is not a datetime");
    }

    public override void Write(
        Utf8JsonWriter writer,
        DateTime value,
        JsonSerializerOptions options)
    {
            var utcFormat = value.Kind == DateTimeKind.Utc ? "'Z'" : string.Empty;
            writer.WriterStringValue(value.ToString($"yyyy-MM-dd'T'HH:mm:ss{utcFormat}", 
                CultureInfo.InvariantCulture));
    }
}

И я добавляю это так:

jsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());

Однако при вызове конвертера значение показывает неправильную дату:

Я считаю, что оно должно иметь значение «2024-05-30T15:46:45», но оно показывает «1/1/0001 12:00:00».

Можете ли вы сказать мне, что я делаю неправильно? Я что-то пропустил? Моя цель — прочитать JSON из базы данных и отправить его в приложение React. Мы используем библиотеку System.Text.Json.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
0
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш JSON находится в верблюжьем случае. По умолчанию PropertyNameCaseInsensitive — это false.

Либо установите для PropertyNameCaseInsensitivity значение true в экземпляре JsonSerializerOptions.

jsonSerializerOptions.PropertyNameCaseInsensitive  = true;

или установите PropertyNamingPolicy на JsonNamingPolicy.CamelCase.

jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
Демо @ .NET Fiddle
Yong Shun 31.05.2024 09:06

Другие вопросы по теме