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 데이터를 효율적으로 저장하거나 네트워크를 통해 주고받을 수 있습니다.

코드: 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 사이트의 관련 아티클을 검색해 보길 권장합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com