Procédure pour autoriser certains types de JSON non valides avec System.Text.Json
Dans cet article, vous allez apprendre à autoriser les commentaires, les virgules de fin et les nombres entre guillemets en JSON, et à écrire des nombres sous forme de chaînes.
Autoriser les commentaires et les virgules de fin
Par défaut, les commentaires et les virgules de fin ne sont pas autorisés dans JSON. Pour autoriser les commentaires dans le code JSON, définissez la propriété JsonSerializerOptions.ReadCommentHandling sur JsonCommentHandling.Skip
.
Pour autoriser les virgules de fin, définissez la propriété JsonSerializerOptions.AllowTrailingCommas sur true
. L’exemple suivant montre comment autoriser les deux :
var options = new JsonSerializerOptions
{
ReadCommentHandling = JsonCommentHandling.Skip,
AllowTrailingCommas = true,
};
WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(
jsonString,
options
)!;
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.ReadCommentHandling = JsonCommentHandling.Skip,
.AllowTrailingCommas = True
}
Dim weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString, options)
Voici un exemple JSON avec des commentaires et une virgule de fin :
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25, // Fahrenheit 77
"Summary": "Hot", /* Zharko */
// Comments on
/* separate lines */
}
Autoriser ou écrire des nombres entre guillemets
Certains sérialiseurs encodent des nombres sous forme de chaînes JSON (entourées de guillemets).
Par exemple :
{
"DegreesCelsius": "23"
}
À la place de :
{
"DegreesCelsius": 23
}
Pour sérialiser des nombres entre guillemets ou accepter des nombres entre guillemets sur l’ensemble du graphique d’objets d’entrée, définissez JsonSerializerOptions.NumberHandling comme indiqué dans l’exemple suivant :
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
Imports System.Text.Json
Imports System.Text.Json.Serialization
Namespace QuotedNumbers
Public Class Forecast
Public Property [Date] As Date
Public Property TemperatureC As Integer
Public Property Summary As String
End Class
Public NotInheritable Class Program
Public Shared Sub Main()
Dim forecast1 As New Forecast() With {
.[Date] = Date.Now,
.TemperatureC = 40,
.Summary = "Hot"
}
Dim options As New JsonSerializerOptions() With {
.NumberHandling = JsonNumberHandling.AllowReadingFromString Or
JsonNumberHandling.WriteAsString,
.WriteIndented = True
}
Dim forecastJson As String = JsonSerializer.Serialize(forecast1, options)
Console.WriteLine($"Output JSON:{forecastJson}")
Dim forecastDeserialized As Forecast = JsonSerializer.Deserialize(Of Forecast)(forecastJson, options)
Console.WriteLine($"Date: {forecastDeserialized.[Date]}")
Console.WriteLine($"TemperatureC: {forecastDeserialized.TemperatureC}")
Console.WriteLine($"Summary: {forecastDeserialized.Summary}")
End Sub
End Class
End Namespace
' 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
Lorsque vous utilisez System.Text.Json
indirectement via ASP.NET Core, les nombres entre guillemets sont autorisés lors de la désérialisation, car ASP.NET Core spécifie les options web par défaut.
Pour autoriser ou écrire des nombres entre guillemets pour des propriétés, des champs ou des types spécifiques, utilisez l’attribut [JsonNumberHandling].