Эквивалент JsonConverter в использовании System.Text.Json
Я начинаю мигрировать некоторый код, который у меня есть Newtonsoft.Json
в System.Text.Json
в приложении.net Core 3.0.
Я перенес свойства из
[JsonProperty("id")]
в [JsonPropertyName("id")]
но у меня есть некоторые свойства, украшенные JsonConverter
атрибут как:
[JsonConverter(typeof(DateTimeConverter))]
[JsonPropertyName("birth_date")]
DateTime BirthDate{ get; set; }
Но я не могу найти эквивалент этого конвертера Newtonsoft в System.Text.Json
Кто-нибудь знает, как этого можно достичь в.net Core 3.0?
Спасибо!
0 ответов
System.Text.Json теперь поддерживает пользовательские конвертеры типов в.NET 3.0 preview-7 и выше.
Там нет атрибута, но вы можете добавить конвертеры, которые соответствуют типу и создать свой собственный тип, если вам нужно что-то конкретное. Вот пример применения к long
преобразовать их в и из string
(потому что javascript не поддерживает 64-битные целые числа).
public class LongToStringConverter : JsonConverter<long>
{
public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) && span.Length == bytesConsumed)
return number;
}
return reader.GetInt64();
}
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
Зарегистрируйте конвертер, добавив его в Converters
список в JsonSerializerOptions
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new LongToStringSupport());
});
Вы можете найти JsonConverterAttribute
в пространстве имен System.Text.Json.Serialization
.