JsonConverter equivalent in using System.Text.Json

前端 未结 2 1832
挽巷
挽巷 2020-12-08 15:56

I\'m starting to migrate some code I have from Newtonsoft.Json to System.Text.Json in a .net Core 3.0 app.

I migrated the properties from

相关标签:
2条回答
  • 2020-12-08 16:22

    You can find the JsonConverterAttribute in the namespace System.Text.Json.Serialization.

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

    0 讨论(0)
  • 2020-12-08 16:26

    System.Text.Json now supports custom type converters in .NET 3.0 preview-7 and above.

    You can add converters that match on type, and use the JsonConverter attribute to use a specific converter for a property.

    Here's an example to convert between long and string (because javascript doesn't support 64-bit integers).

    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());
        }
    }
    

    Register the converter by adding it to the Converters list in JsonSerializerOptions

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

    Note: The current release doesn't support nullable types yet.

    0 讨论(0)
提交回复
热议问题