Ler em inglês

Partilhar via


Como instanciar instâncias JsonSerializerOptions com System.Text.Json

Este artigo explica como evitar problemas de desempenho ao usar JsonSerializerOptionso . Ele também mostra como usar os construtores parametrizados que estão disponíveis.

Reutilizar instâncias JsonSerializerOptions

Se você usar JsonSerializerOptions repetidamente com as mesmas opções, não crie uma nova JsonSerializerOptions instância cada vez que usá-la. Reutilize a mesma instância para cada chamada. Esta orientação aplica-se ao código que escreve para conversores personalizados e quando liga JsonSerializer.Serialize ou JsonSerializer.Deserialize. É seguro usar a mesma instância em vários threads. Os caches de metadados na instância de opções são thread-safe, e a instância é imutável após a primeira serialização ou desserialização.

A JsonSerializerOptions.Default propriedade

Se a instância que você precisa usar for a instância padrão (tem todas as configurações padrão e os conversores padrão), use a JsonSerializerOptions.Default propriedade em vez de criar uma instância de JsonSerializerOptions opções. Para obter mais informações, consulte Usar conversor de sistema padrão.

Copiar JsonSerializerOptions

Há um construtor JsonSerializerOptions que permite criar uma nova instância com as mesmas opções de uma instância existente, conforme mostrado no exemplo a seguir:

using System.Text.Json;

namespace CopyOptions
{
    public class Forecast
    {
        public DateTime Date { get; init; }
        public int TemperatureC { get; set; }
        public string? Summary { get; set; }
    };

    public class Program
    {
        public static void Main()
        {
            Forecast forecast = new()
            {
                Date = DateTime.Now,
                TemperatureC = 40,
                Summary = "Hot"
            };

            JsonSerializerOptions options = new()
            {
                WriteIndented = true
            };

            JsonSerializerOptions optionsCopy = new(options);
            string forecastJson =
                JsonSerializer.Serialize<Forecast>(forecast, optionsCopy);

            Console.WriteLine($"Output JSON:\n{forecastJson}");
        }
    }
}

// Produces output like the following example:
//
//Output JSON:
//{
//  "Date": "2020-10-21T15:40:06.8998502-07:00",
//  "TemperatureC": 40,
//  "Summary": "Hot"
//}

O cache de metadados da instância existente JsonSerializerOptions não é copiado para a nova instância. Portanto, usar esse construtor não é o mesmo que reutilizar uma instância existente do JsonSerializerOptions.

Padrões da Web para JsonSerializerOptions

As opções a seguir têm padrões diferentes para aplicativos Web:

No .NET 9 e versões posteriores, você pode usar o JsonSerializerOptions.Web singleton para serializar com as opções padrão que o ASP.NET Core usa para aplicativos Web. Em versões anteriores, chame o construtor JsonSerializerOptions para criar uma nova instância com os padrões da Web, conforme mostrado no exemplo a seguir:

using System.Text.Json;

namespace OptionsDefaults
{
    public class Forecast
    {
        public DateTime? Date { get; init; }
        public int TemperatureC { get; set; }
        public string? Summary { get; set; }
    };

    public class Program
    {
        public static void Main()
        {
            Forecast forecast = new()
            {
                Date = DateTime.Now,
                TemperatureC = 40,
                Summary = "Hot"
            };

            JsonSerializerOptions options = new(JsonSerializerDefaults.Web)
            {
                WriteIndented = true
            };

            Console.WriteLine(
                $"PropertyNameCaseInsensitive: {options.PropertyNameCaseInsensitive}");
            Console.WriteLine(
                $"JsonNamingPolicy: {options.PropertyNamingPolicy}");
            Console.WriteLine(
                $"NumberHandling: {options.NumberHandling}");

            string forecastJson = JsonSerializer.Serialize<Forecast>(forecast, options);
            Console.WriteLine($"Output JSON:\n{forecastJson}");

            Forecast? forecastDeserialized =
                JsonSerializer.Deserialize<Forecast>(forecastJson, options);

            Console.WriteLine($"Date: {forecastDeserialized?.Date}");
            Console.WriteLine($"TemperatureC: {forecastDeserialized?.TemperatureC}");
            Console.WriteLine($"Summary: {forecastDeserialized?.Summary}");
        }
    }
}

// Produces output like the following example:
//
//PropertyNameCaseInsensitive: True
//JsonNamingPolicy: System.Text.Json.JsonCamelCaseNamingPolicy
//NumberHandling: AllowReadingFromString
//Output JSON:
//{
//  "date": "2020-10-21T15:40:06.9040831-07:00",
//  "temperatureC": 40,
//  "summary": "Hot"
//}
//Date: 10 / 21 / 2020 3:40:06 PM
//TemperatureC: 40
//Summary: Hot