C# JSON 직렬화 및 역직렬화 완벽 가이드

직렬화와 역직렬화의 개념

데이터 직렬화(Serialization)는 객체의 상태 정보를 저장하거나 네트워크를 통해 전송할 수 있는 형식으로 변환하는 과정입니다. 즉, C# 클래스 인스턴스를 JSON 문자열로 바꾸는 것을 직렬화라고 합니다. 여기서 '객체의 상태 정보'는 클래스의 속성들을 의미합니다.

역직렬화(Deserialization)는 JSON 문자열을 C# 클래스 객체로 변환하는 반대 과정입니다. 예를 들어, {"name":"홍길동","age":25,"isStudent":true} 같은 JSON 문자열을 직접 다루려면 문자열 파싱 작업이 필요해 번거롭습니다. 역직렬화를 사용하면 이런 문자열을 C# 객체로 변환하여 속성에 쉽게 접근할 수 있습니다.

JSON이란?

JSON(JavaScript Object Notation)은 가볍고 널리 사용되는 데이터 교환 형식입니다. XML과 비교했을 때 더 작은 크기, 빠른 전송 속도, 쉬운 구문 분석이 가능합니다. 웹 프로젝트에서 특히 많이 사용되며, 웹 API 응답은 대부분 JSON 형식으로 반환됩니다. WinForm 프로젝트에서는 상대적으로 덜 사용됩니다.

주요 데이터 교환 형식: 일반 텍스트, HTML, XML(WebService), JSON

JSON 문법 규칙

  • 속성 이름은 반드시 큰따옴표로 감싸야 함
  • 문자열 값은 큰따옴표로, 숫자와 불리언 값은 따옴표 없이 사용
  • 객체 {} 또는 배열 []의 마지막 항목 뒤에는 쉼표를 사용하지 않음
  • 데이터는 이름/값 쌍으로 구성
  • 백슬래시 \로 특수 문자 이스케이프
  • 중괄호 {}는 객체, 대괄호 []는 배열을 나타냄

JSON은 객체와 배열이 서로 중첩되어 무한 계층 구조의 데이터를 표현할 수 있습니다. JSON 파싱 도구로는 x-json.cn, 크롬 확장 프로그램 JSON-handle 등이 유용합니다.

C#에서 JSON 직렬화/역직렬화 구현

Newtonsoft.Json(Json.NET) 라이브러리는 .NET에서 가장 널리 사용되는 JSON 처리 라이브러리입니다.


// 직렬화를 위한 클래스 정의 (Serializable 특성은 선택 사항)
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsMale { get; set; }
    public DateTime BirthDate { get; set; }
    public string[] Hobbies { get; set; }
    public Person Friend { get; set; }
}

// 객체 생성 및 초기화
var person = new Person
{
    Id = 1,
    Name = "김철수",
    IsMale = true,
    BirthDate = DateTime.Now,
    Hobbies = new[] { "독서", "운동" },
    Friend = new Person 
    { 
        Id = 2, 
        Name = "이영희", 
        IsMale = false, 
        BirthDate = DateTime.Now 
    }
};

// 클래스의 기본 ToString() 메서드는 JSON 직렬화에 적합하지 않음
// 직접 재정의하려면 문자열 연결이 번거로움

// 직렬화: C# 객체 → JSON 문자열
string jsonResult = JsonConvert.SerializeObject(person);
Console.WriteLine(jsonResult);
// 출력: {"Id":1,"Name":"김철수","IsMale":true,"BirthDate":"...","Hobbies":["독서","운동"],"Friend":{"Id":2,"Name":"이영희","IsMale":false,"BirthDate":"..."}}

// 역직렬화: JSON 문자열 → C# 객체
Person restoredPerson = JsonConvert.DeserializeObject<Person>(jsonResult);
Console.WriteLine($"{restoredPerson.Name}, 친구: {restoredPerson.Friend.Name}");
// 출력: 김철수, 친구: 이영희

직렬화/역직렬화의 장점

직렬화는 객체 데이터를 파일에 저장하거나 네트워크로 전송할 때 유용합니다. 역직렬화는 JSON 문자열을 직접 파싱하는 번거로움 없이 객체 지향 방식으로 데이터에 접근할 수 있게 해줍니다.

태그: JSON C# Newtonsoft.Json Json.NET 직렬화

7월 11일 18:12에 게시됨