Эквивалент 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.

https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonconverterattribute?view=netcore-3.0

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