Zulassen einiger Arten von ungültigem JSON-Code mit System.Text.Json
In diesem Artikel erfahren Sie, wie Sie Kommentare, nachfolgende Kommas und Zahlen in Anführungszeichen in JSON zulassen, und wie Sie Zahlen als Zeichenfolgen schreiben.
Zulassen von Kommentaren und nachfolgenden Kommas
Standardmäßig sind Kommentare und nachfolgende Kommas in JSON nicht zulässig. Um Kommentare im JSON-Code zuzulassen, legen Sie die JsonSerializerOptions.ReadCommentHandling-Eigenschaft auf JsonCommentHandling.Skip
fest.
Und um nachfolgende Kommas zuzulassen, legen Sie die JsonSerializerOptions.AllowTrailingCommas-Eigenschaft auf true
fest. Das folgende Beispiel veranschaulicht, wie Sie beides zulassen:
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)
Im Folgenden finden Sie ein JSON-Beispiel mit Kommentaren und einem nachfolgenden Komma:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25, // Fahrenheit 77
"Summary": "Hot", /* Zharko */
// Comments on
/* separate lines */
}
Zulassen oder Schreiben von Zahlen in Anführungszeichen
Einige Serialisierungsmodule codieren Zahlen als (in Anführungszeichen eingeschlossene) JSON-Zeichenfolgen.
Beispiel:
{
"DegreesCelsius": "23"
}
Verwenden Sie anstelle von
{
"DegreesCelsius": 23
}
Um Zahlen in Anführungszeichen zu serialisieren oder Zahlen in Anführungszeichen im gesamten Graphen des Eingabeobjekts zu akzeptieren, legen Sie JsonSerializerOptions.NumberHandling wie im folgenden Beispiel gezeigt fest:
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
Wenn Sie System.Text.Json
indirekt über ASP.NET Core verwenden, sind beim Deserialisieren Zahlen in Anführungszeichen erlaubt, da ASP.NET Core Webstandardoptionen angibt.
Um Zahlen in Anführungszeichen für bestimmte Eigenschaften, Felder oder Typen zuzulassen oder zu schreiben, verwenden Sie das Attribut [JsonNumberHandling].