JSON을 .NET 개체로 읽는 방법(역직렬화)

이 문서에서는 System.Text.Json 네임스페이스를 사용하여 JSON(JavaScript Object Notation)으로부터 역직렬화하는 방법을 보여줍니다. Newtonsoft.Json에서 기존 코드를 이식하는 경우 System.Text.Json으로 마이그레이션 방법을 참조하세요.

JSON을 역직렬화하는 일반적인 방법은 하나 이상의 JSON 속성을 나타내는 속성 및 필드가 있는 .NET 클래스를 갖거나 만드는 것입니다. 그런 다음 문자열 또는 파일에서 역직렬화하려면 JsonSerializer.Deserialize 메서드를 호출합니다. 제네릭 오버로드의 경우 제네릭 형식 매개 변수는 .NET 클래스입니다. 제네릭이 아닌 오버로드의 경우 클래스의 형식을 메서드 매개 변수로 전달합니다. 동기적 또는 비동기적으로 역직렬화할 수 있습니다.

GitHub Copilot을 사용하여 JSON 문자열 역직렬화를 위해 AI 지원을 사용할 수 있습니다.

클래스에 표시되지 않는 JSON 속성은 기본적으로 무시됩니다. 또한 형식의 필수 속성이 JSON 페이로드에 없는 경우 역직렬화가 실패합니다.

예제

다음 예제에서는 JSON 문자열을 역직렬화하는 방법을 보여줍니다.

using System.Text.Json;

namespace DeserializeExtra
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
        public string? SummaryField;
        public IList<DateTimeOffset>? DatesAvailable { get; set; }
        public Dictionary<string, HighLowTemps>? TemperatureRanges { get; set; }
        public string[]? SummaryWords { get; set; }
    }

    public class HighLowTemps
    {
        public int High { get; set; }
        public int Low { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            string jsonString =
                """
                {
                  "Date": "2019-08-01T00:00:00-07:00",
                  "TemperatureCelsius": 25,
                  "Summary": "Hot",
                  "DatesAvailable": [
                    "2019-08-01T00:00:00-07:00",
                    "2019-08-02T00:00:00-07:00"
                  ],
                  "TemperatureRanges": {
                                "Cold": {
                                    "High": 20,
                      "Low": -10
                                },
                    "Hot": {
                                    "High": 60,
                      "Low": 20
                    }
                            },
                  "SummaryWords": [
                    "Cool",
                    "Windy",
                    "Humid"
                  ]
                }
                """;
                
            WeatherForecast? weatherForecast = 
                JsonSerializer.Deserialize<WeatherForecast>(jsonString);

            Console.WriteLine($"Date: {weatherForecast?.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast?.Summary}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
weatherForecast = JsonSerializer.Deserialize(Of WeatherForecastWithPOCOs)(jsonString)

동기 코드를 사용하여 파일에서 역직렬화하려면 다음 예제와 같이 파일을 문자열로 읽습니다.

using System.Text.Json;

namespace DeserializeFromFile
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            string fileName = "WeatherForecast.json";
            string jsonString = File.ReadAllText(fileName);
            WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString)!;

            Console.WriteLine($"Date: {weatherForecast.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast.Summary}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
jsonString = File.ReadAllText(fileName)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)

비동기 코드를 사용하여 파일에서 역직렬화하려면 DeserializeAsync 메서드를 호출합니다.

using System.Text.Json;

namespace DeserializeFromFileAsync
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static async Task Main()
        {
            string fileName = "WeatherForecast.json";
            using FileStream openStream = File.OpenRead(fileName);
            WeatherForecast? weatherForecast = 
                await JsonSerializer.DeserializeAsync<WeatherForecast>(openStream);

            Console.WriteLine($"Date: {weatherForecast?.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast?.Summary}");
        }
    }
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
Dim openStream As FileStream = File.OpenRead(fileName)
weatherForecast1 = Await JsonSerializer.DeserializeAsync(Of WeatherForecast)(openStream)

역직렬화 동작

JSON을 역직렬화할 때 다음 동작이 적용됩니다.

ASP.NET Core 앱에서 System.Text.Json을 간접적으로 사용하는 경우 몇 가지 기본 동작이 다릅니다. 자세한 내용은 JsonSerializerOptions 웹 기본값을 참조하세요.

기본 변환기에서 지원하지 않는 기능을 제공하는 사용자 지정 변환기를 구현할 수 있습니다.

.NET 클래스 없이 역직렬화

역직렬화하려는 JSON이 있고 역직렬화 대상 클래스가 없는 경우 필요한 클래스를 수동으로 만드는 것 외에 다른 옵션이 있습니다.

  • Utf8JsonReader를 직접 사용합니다.

  • JSON DOM(문서 개체 모델)으로 역직렬화하고 DOM에서 필요한 항목을 추출합니다.

    DOM을 사용하면 JSON 페이로드의 하위 섹션으로 이동하고 단일 값, 사용자 지정 형식 또는 배열을 역직렬화할 수 있습니다. JsonNode DOM에 대한 자세한 내용은 JSON 페이로드의 하위 섹션 역직렬화를 참조하세요. JsonDocument DOM에 대한 자세한 내용은 JsonDocument 및 JsonElement에서 하위 요소를 검색하는 방법을 참조하세요.

  • Visual Studio 2022를 사용하여 필요한 클래스를 자동으로 생성합니다.

    • 역직렬화해야 하는 JSON을 복사합니다.
    • 클래스 파일을 만들고 템플릿 코드를 삭제합니다.
    • 편집>선택하여 붙여넣기>JSON을 클래스로 붙여넣기를 선택합니다.

    결과는 역직렬화 대상에 사용할 수 있는 클래스입니다.

UTF-8에서 역직렬화

UTF-8에서 역직렬화하려면 다음 예제와 같이 ReadOnlySpan<byte> 또는 Utf8JsonReader을 사용하는 JsonSerializer.Deserialize 오버로드를 호출합니다. 이 예제에서는 JSON이 jsonUtf8Bytes라는 바이트 배열에 있다고 가정합니다.

var readOnlySpan = new ReadOnlySpan<byte>(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast = 
    JsonSerializer.Deserialize<WeatherForecast>(readOnlySpan)!;
Dim jsonString = Encoding.UTF8.GetString(jsonUtf8Bytes)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)
var utf8Reader = new Utf8JsonReader(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast = 
    JsonSerializer.Deserialize<WeatherForecast>(ref utf8Reader)!;
' This code example doesn't apply to Visual Basic. For more information, go to the following URL:
' https://video2.skills-academy.com/dotnet/standard/serialization/system-text-json-how-to#visual-basic-support

GitHub Copilot을 사용하여 JSON으로 역직렬화

IDE에서 GitHub Copilot를 사용하여 JSON에서 역직렬화하는 데 System.Text.Json을 사용하는 코드를 생성할 수 있습니다.

Visual Studio 2022 버전 17.8 이상을 사용하는 경우 AI 기반 Visual Studio의 GitHub Copilot를 사용하여 JSON 역직렬화에 System.Text.Json을 사용하는 코드를 생성할 수 있습니다. 다음 예제와 같이 Copilot 채팅 창에서 프롬프트로 질문을 제출합니다. 편집기 창 자체에서 인라인 채팅을 사용하여 프롬프트를 제출할 수도 있습니다.

참고 항목

GitHub Copilot는 AI를 통해 구동되므로 예상치 못한 실수가 발생할 수 있습니다. 생성된 코드 또는 제안을 확인해야 합니다. GitHub Copilot의 일반적인 사용, 제품 영향, 사용자 감독 및 개인 정보에 대한 자세한 내용은 GitHub Copilot FAQ를 참조하세요.

다음 텍스트는 Copilot 채팅의 프롬프트 예를 보여줍니다.

System.Text.Json을 사용하여 JSON 문자열 {"FirstName":"John","LastName":"Doe","Age":30}을 해당하는 .NET 개체로 역직렬화하는 코드를 생성합니다. 속성 이름 & 값을 매핑합니다. 예제 출력을 제공합니다.

요구 사항에 맞는 속성 이름 및 값이 있는 JSON 문자열을 사용하도록 프롬프트를 사용자 지정할 수 있습니다.

슬래시 명령, 파일, 메서드 또는 클래스에 대한 참조, 스레드와 같은 채팅 기능을 사용하여 의도를 설정하고 범위가 지정된 컨텍스트를 통해 더 나은 답변을 얻을 수 있습니다. IDE에 열려 있는 프로젝트의 기존 클래스의 경우 /generate code to dserialize JSON to equivalent .NET object in #Filename을(를) 사용하여 GitHub Copilot에 메시지를 표시할 수 있습니다.

다음 출력은 Copilot 채팅 응답의 예를 보여줍니다.

Here's an example of how you can use `System.Text.Json` to deserialize a JSON string into a .NET object in C#:

using System;
using System.Text.Json;
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        string jsonString = "{\"FirstName\":\"John\",\"LastName\":\"Doe\",\"Age\":30}";
        Person person = JsonSerializer.Deserialize<Person>(jsonString);
        Console.WriteLine($"FirstName: {person.FirstName}");
        Console.WriteLine($"LastName: {person.LastName}");
        Console.WriteLine($"Age: {person.Age}");
    }
}

**Example Output**
FirstName: John
LastName: Doe
Age: 30

This code defines a Person class with properties that match the JSON string. It then uses `JsonSerializer.Deserialize` to convert the JSON string into a `Person` object and prints the properties to the console.

Copilot이 코드 블록을 반환하면 응답에 코드 복사, 새 파일에 코드 삽입 또는 코드 출력 미리 보기 옵션이 포함됩니다.

참고 항목

결과는 이러한 예시 응답에 표시된 것과 다를 수 있습니다. AI 모델은 비결정적이므로 동일한 질문을 할 때 다른 응답을 반환할 수 있습니다. 이는 시간이 지남에 따라 추가적인 학습과 적응, 언어의 차이, 채팅 기록과 같은 상황의 변화 등으로 인해 발생할 수 있습니다.

Visual Studio에서 GitHub Copilot Chat을 사용하여 개체를 JSON 문자열을 .NET 개체로 역직렬화하는 것을 보여주는 애니메이션 스크린샷입니다.

자세한 내용은 다음을 참조하세요.