web-dev-qa-db-fra.com

JsonConverter équivalent à l'utilisation de System.Text.Json

Je commence à migrer du code que j'ai de Newtonsoft.Json Vers System.Text.Json Dans une application .net Core 3.0.

J'ai migré les propriétés de

[JsonProperty("id")] à [JsonPropertyName("id")]

mais j'ai quelques propriétés décorées avec l'attribut JsonConverter comme:

[JsonConverter(typeof(DateTimeConverter))] [JsonPropertyName("birth_date")] DateTime BirthDate{ get; set; }

Mais je ne trouve pas l'équivalent de ce convertisseur Newtonsoft dans System.Text.Json Est-ce que quelqu'un sait comment cela peut être réalisé dans .net Core 3.0?

Merci!

18
Fritjof Berggren

System.Text.Json prend désormais en charge les convertisseurs de type personnalisé dans .NET 3.0 preview-7 et versions ultérieures.

Vous pouvez ajouter des convertisseurs qui correspondent au type et utiliser l'attribut JsonConverter pour utiliser un convertisseur spécifique pour une propriété.

Voici un exemple de conversion entre long et string (car javascript ne prend pas en charge les entiers 64 bits).

public class LongToStringConverter : JsonConverter<long>
{
    public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            // try to parse number directly from bytes
            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;

            // try to parse from a string if the above failed, this covers cases with other escaped/UTF characters
            if (Int64.TryParse(reader.GetString(), out number))
                return number;
        }

        // fallback to default handling
        return reader.GetInt64();
    }

    public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

Enregistrez le convertisseur en l'ajoutant à la liste Converters dans JsonSerializerOptions

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new LongToStringConverter());
});

Remarque: la version actuelle ne prend pas encore en charge les types nullables.

12
Mani Gandham

Vous pouvez trouver le JsonConverterAttribute dans l'espace de noms System.Text.Json.Serialization.

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

1
Lars