Ler em inglês

Compartilhar via


Como permitir alguns tipos de JSON inválidos com System.Text.Json

Neste artigo, você aprenderá a permitir comentários, vírgulas à direita e números entre aspas no JSON e como escrever números como cadeias de caracteres.

Permitir comentários e vírgulas à direita

Por padrão, comentários e vírgulas à direita não são permitidos no JSON. Para permitir comentários no JSON, defina a propriedade JsonSerializerOptions.ReadCommentHandling como JsonCommentHandling.Skip. E para permitir vírgulas à direita, defina a propriedade JsonSerializerOptions.AllowTrailingCommas como true. O exemplo a seguir mostra como permitir ambos:

C#
var options = new JsonSerializerOptions
{
    ReadCommentHandling = JsonCommentHandling.Skip,
    AllowTrailingCommas = true,
};
WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(
    jsonString,
    options
    )!;

Aqui está o exemplo JSON com comentários e uma vírgula à direita:

JSON
{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25, // Fahrenheit 77
  "Summary": "Hot", /* Zharko */
  // Comments on
  /* separate lines */
}

Permitir ou gravar números entre aspas

Alguns serializadores codificam números como cadeias de caracteres JSON (entre aspas).

Por exemplo:

JSON
{
    "DegreesCelsius": "23"
}

Em vez de:

JSON
{
    "DegreesCelsius": 23
}

Para serializar números entre aspas ou aceitar números entre aspas em todo o grafo de objetos de entrada, defina JsonSerializerOptions.NumberHandling conforme mostrado no exemplo a seguir:

C#
using System.Text.Json;
using System.Text.Json.Serialization;

namespace QuotedNumbers
{
    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()
            {
                NumberHandling =
                    JsonNumberHandling.AllowReadingFromString |
                    JsonNumberHandling.WriteAsString,
                WriteIndented = true
            };

            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:
//
//Output JSON:
//{
//  "Date": "2020-10-23T12:27:06.4017385-07:00",
//  "TemperatureC": "40",
//  "Summary": "Hot"
//}
//Date: 10/23/2020 12:27:06 PM
//TemperatureC: 40
//Summary: Hot

Quando você usa System.Text.Json indiretamente por meio do ASP.NET Core, os números entre aspas são permitidos ao desserializar porque o ASP.NET Core especifica opções padrão da Web.

Para permitir ou gravar números entre aspas para propriedades, campos ou tipos específicos, use o atributo [JsonNumberHandling].

Confira também