다음을 통해 공유


다음과 같은 특정 종류의 잘못된 JSON을 허용하는 방법 System.Text.Json

이 문서에서는 JSON에서 주석, 후행 쉼표 및 따옴표 붙은 숫자를 허용하는 방법과 숫자를 문자열로 작성하는 방법을 알아봅니다.

메모 및 후행 쉼표 허용

기본적으로 주석 및 후행 쉼표는 JSON에서 허용되지 않습니다. JSON에서 주석을 허용하려면 속성을 JsonSerializerOptions.ReadCommentHandling.로 설정합니다JsonCommentHandling.Skip. 후행 쉼표가 허용되도록 하려면 속성을 JsonSerializerOptions.AllowTrailingCommas.로 설정합니다true. 다음 예제에서는 두 가지를 모두 허용하는 방법을 보여 있습니다.

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)

다음은 주석과 후행 쉼표가 있는 JSON 예제입니다.

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

따옴표 안에 숫자를 허용하거나 씁니다.

일부 serializer는 숫자를 JSON 문자열로 인코딩합니다(따옴표로 묶음).

다음은 그 예입니다.

{
    "DegreesCelsius": "23"
}

대신에:

{
    "DegreesCelsius": 23
}

숫자를 따옴표로 직렬화하거나 전체 입력 개체 그래프에서 따옴표로 숫자를 허용하려면 다음 예제와 같이 설정합니다 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 Run()
        {
            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를 통해 간접적으로 사용하는 System.Text.Json 경우 ASP.NET Core는 웹 기본 옵션을 지정하기 때문에 역직렬화할 때 따옴표 붙은 숫자가 허용됩니다.

특정 속성, 필드 또는 형식에 따옴표 붙은 숫자를 허용하거나 쓰려면 [JsonNumberHandling] 특성을 사용합니다.

참고하십시오