59. [3] XML과 JSON 다루기 맛보기
이번 강의에서는 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 사이트의 관련 아티클을 검색해 보길 권장합니다.