59. [3] XML과 JSON 다루기 맛보기

  • 7 minutes to read

이번 강의에서는 XML 데이터와 JSON 데이터를 다루는 데 사용되는 닷넷 API를 하나씩 소개하겠습니다. 이 두 가지 데이터를 다루는 API를 모두 다루려면 책 한 권 이상의 분량이기에 소개하는 차원에서 한두 개만 다룰 것입니다.

> // XML과 JSON: 닷넷에는 XML과 JSON 데이터를 다루는 많은 수의 API를 제공

59.1. XElement 클래스를 사용하여 XML 요소를 생성하거나 가공하기

이번에는 XML 데이터를 다루는 XElement 클래스를 사용해보겠습니다.

코드: XElementDemo.cs

//[?] `XElement` 클래스: XML 요소를 생성하거나 담을 수 있는 그릇
using System;
using System.Linq;
using System.Xml.Linq;

class XElementDemo
{
    static void Main()
    {
        //[1] XML 요소 생성
        XElement category = new XElement("Menus",
            new XElement("Menu", "책"),
            new XElement("Menu", "강의"),
            new XElement("Menu", "컴퓨터")
        );
        Console.WriteLine(category);

        //[2] XML 요소 가공
        XElement newCategory = new XElement("Menus",
            from node in category.Elements()
            where node.Value.ToString().Length >= 2
            select node
        );
        Console.WriteLine(newCategory);
    }
}
<Menus>
  <Menu>책</Menu>
  <Menu>강의</Menu>
  <Menu>컴퓨터</Menu>
</Menus>
<Menus>
  <Menu>강의</Menu>
  <Menu>컴퓨터</Menu>
</Menus>

XML 데이터를 다루는 클래스 중에서 XElement 클래스를 사용하여 XML 데이터를 만들고, XML 데이터에 LINQ를 사용하여 XML 요소를 가공하는 내용입니다. 이 책을 통해서 많이 얘기하지만, 지금 학습하고 있는 시점에서는 "이런 클래스도 있고 이렇게 하면 이런 결과가 나오는구나." 정도로 가볍게 살펴보고 넘어가도 됩니다.

59.2. JSON(JavaScript Object Notation) 데이터 직렬화 및 역직렬화

JSON(JavaScript Object Notation) 데이터는 최근 프로그래밍에서는 많이 사용하는 데이터 구조입니다. C# 개체를 JSON 문자열로 변환하는 내용을 직렬화(Serialize)라고 하며 그 반대로 JSON 문자열을 C# 개체로 변환하는 것을 역직렬화(Deserialize)라고 합니다.

  • 직렬화(Serialize): C# 개체를 JSON 데이터로 변환
  • 역직렬화(Deserialize): JSON 데이터를 C# 개체로 변환

이러한 JSON 직렬화 및 역직렬화를 편리하게 사용할 수 있는 API는 JSON.NET 이름의 아래 경로의 NuGet 패키지를 활용할 수 있습니다.

미리보기 동영상

다음 경로를 통해서 C#의 JSON 데이터 직렬화 및 역직렬화에 대한 미리보기 동영상을 보실 수 있습니다.

59.2.1. JSON 데이터 다루기

JSON 데이터 다루는 내용에 대해서는 C# Interactive에서 아래 코드를 단계별로 실행해 보세요.

프로젝트 기반 소스는 JsonConvertDemo.cs 파일에 들어 있습니다.

(1) 먼저, JSON.NET을 사용하려면 Newtonsoft.Json.dll 파일을 NuGet 패키지 관리자를 통해서 참조해야 합니다. C# Interactive에서는 아래 코드로 참조가 가능합니다.

> #r "Newtonsoft.Json"

(2) DLL 파일을 참조한 후 코드 상단에 네임스페이스를 참조합니다.

> using Newtonsoft.Json;

(3) 샘플 클래스인 Shirt 클래스를 다음과 같이 작성합니다.

> public class Shirt
. {
.     public string Name { get; set; }
.     public DateTime Created { get; set; }
.     public List<string> Sizes { get; set; }
. }

(4) 먼저 C# 개체를 JSON 데이터로 변환하는 직렬화 예제를 구현하도록 하겠습니다. 직렬화는 JsonConvert 클래스의 SerializeObject() 메서드를 사용합니다.

> //[1] 직렬화(Serialize) 데모
. Shirt shirt1 = new Shirt
. {
.     Name = "Red Shirt",
.     Created = new DateTime(2020, 01, 01),
.     Sizes = new List<string> { "Small" }
. };
. string json1 = JsonConvert.SerializeObject(shirt1, Formatting.Indented);
. Console.WriteLine(json1);
{
  "Name": "Red Shirt",
  "Created": "2020-01-01T00:00:00",
  "Sizes": [
    "Small"
  ]
}

위 실행 결과처럼 shirt1의 C# 개체는 json1의 JSON 데이터로 변환된 것을 알 수 있습니다.

(5) 이번에는 JSON 데이터를 C# 개체로 변환하는 역직렬화를 구현하도록 하겠습니다. 역직렬화는 JsonConvert 클래스의 DeserializeObject() 메서드를 사용합니다.

> //[2] 역직렬화(Deserialize) 데모
. string json2 = @"{
.     'Name': 'Black Shirt',
.     'Created': '2020-12-31T00:00:00',
.     'Sizes': ['Large', 'Small' ]
. }";
. Shirt shirt2 = JsonConvert.DeserializeObject<Shirt>(json2);
. Console.WriteLine($"{shirt2.Name} - {shirt2.Created}");
Black Shirt - 2020-12-31 오전 12:00:00
> Console.WriteLine(string.Join(",", shirt2.Sizes.ToArray()));
Large,Small

Json2 문자열에 저장되어 있는 JSON 데이터를 동일 형태의 Shirt 개체 형태로 변환하여 각각의 속성 값을 출력해 본 것처럼 JSON.NET을 사용하면 쉽게 직렬화 및 역직렬화를 구현할 수 있습니다.

JsonSerializer 클래스 사용하여 직렬화 및 역직렬화

System.Text.Json.JsonSerializer 클래스를 사용하면 C# 개체를 JSON 문자열로 변환(직렬화)하거나, JSON 문자열을 C# 개체로 변환(역직렬화)할 수 있습니다. 이를 활용하면 JSON 데이터를 효율적으로 저장하거나 네트워크를 통해 주고받을 수 있습니다.

JsonSerializer로 객체 직렬화 및 역직렬화하기: JsonSerializerDemo.cs

코드: JsonSerializerDemo.cs

using System.Text.Json;

public class Shirt
{
    public string? Name { get; set; }
    public DateTime Created { get; set; }
    public List<string>? Sizes { get; set; }
}

public class JsonSerializerDemo
{
    static void Main()
    {
        //[1] 직렬화(Serialize) 데모
        Shirt shirt1 = new Shirt
        {
            Name = "Red Shirt",
            Created = new DateTime(2022, 03, 01),
            Sizes = new List<string> { "Small" }
        };
        string json1 = JsonSerializer.Serialize(shirt1);
        Console.WriteLine(json1);

        //[2] 역직렬화(Deserialize) 데모: 축자 문자열 리터럴로 큰 따옴표를 포함한 JSON 표현 
        string json2 = @"{
            ""Name"": ""Black Shirt"",
            ""Created"": ""2022-12-31T00:00:00"",
            ""Sizes"": [""Large""]
        }";
        Shirt? shirt2 = JsonSerializer.Deserialize<Shirt>(json2);
        Console.WriteLine($"{shirt2!.Name} - {shirt2.Created}");
    }
}
{"Name":"Red Shirt","Created":"2025-03-01T00:00:00","Sizes":["Small"]}
Black Shirt - 2025-12-31 오전 12:00:00

위 예제에서는 Shirt 개체를 JSON 문자열로 변환하는 직렬화 과정과 JSON 문자열을 다시 Shirt 개체로 변환하는 역직렬화 과정을 보여주었습니다. 이를 통해 C#에서 JSON 데이터를 쉽게 다룰 수 있으며, 다양한 애플리케이션에서 활용할 수 있습니다.

장 요약

닷넷에는 많은 수의 XML과 JSON 관련 API를 제공합니다. 이것들은 모두 필요에 의해서 호출해서 사용해야 합니다. 추후 C# 기초 입문이 아닌 웹과 모바일 프로그래밍으로 확장이 된다면 XML과 JSON 관련 API들을 좀 더 자세히 다룹니다. 우선, C# 기초 입문 강의인 본 강의에서는 이런게 있다 정도로 짧게 소개하고 필요하다면 Microsoft Learn 사이트의 관련 아티클을 검색해 보길 권장합니다.

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com