У нас есть приложение 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.
Ваш JSON находится в верблюжьем случае. По умолчанию PropertyNameCaseInsensitive
— это false
.
Либо установите для PropertyNameCaseInsensitivity значение true
в экземпляре JsonSerializerOptions
.
jsonSerializerOptions.PropertyNameCaseInsensitive = true;
или установите PropertyNamingPolicy на JsonNamingPolicy.CamelCase
.
jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;