ile bazı geçersiz JSON türlerine izin verme System.Text.Json

Bu makalede, JSON'da açıklamalara, sondaki virgüllere ve tırnak içine alınmış sayılara nasıl izin verileceğini ve sayıların dize olarak nasıl yazılacağını öğreneceksiniz.

Açıklamalara ve sondaki virgüllere izin ver

Varsayılan olarak, JSON'da açıklamalara ve sondaki virgüllere izin verilmez. JSON'da açıklamalara izin vermek için özelliğini olarak JsonCommentHandling.SkipayarlayınJsonSerializerOptions.ReadCommentHandling. Sondaki virgüllere izin vermek için özelliğini olarak trueayarlayınJsonSerializerOptions.AllowTrailingCommas. Aşağıdaki örnekte her ikisine de izin verme gösterilmektedir:

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)

Açıklamaları ve sondaki virgülleri içeren örnek JSON aşağıda verilmiştir:

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

Tırnak içinde numaralara izin verme veya sayı yazma

Bazı serileştiriciler sayıları JSON dizeleri olarak kodlar (tırnak içine alınır).

Örneğin:

{
    "DegreesCelsius": "23"
}

Aşağıdaki değer yerine:

{
    "DegreesCelsius": 23
}

Tırnak içindeki sayıları seri hale getirmek veya giriş nesnesi grafiğinin tamamında tırnak içindeki sayıları kabul etmek için, aşağıdaki örnekte gösterildiği gibi ayarlayın JsonSerializerOptions.NumberHandling :

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

ASP.NET Core aracılığıyla dolaylı olarak kullandığınızdaSystem.Text.Json, ASP.NET Core web varsayılan seçeneklerini belirttiğinden seri durumdan çıkarılırken tırnak içine alınan sayılara izin verilir.

Belirli özellikler, alanlar veya türler için tırnak içine alınmış sayılara izin vermek veya bunları yazmak için [JsonNumberHandling] özniteliğini kullanın.

Ayrıca bkz.