C#

[C#]객체를 JSON으로 변환(Object to JSON)

DevStory 2021. 9. 25.

객체를 JSON으로 변환(Object to JSON)

이번 포스팅은 C#에서 직렬화(Serialize)를 사용하여 객체를 JSON으로 변환하는 방법을 소개합니다.


JSON이란?

JSON(Javascript Object Notation)은 데이터를 저장하거나 전송할 때 사용되는 경량의 DATA 교환 형식이며, 특정 프로그래밍 언어에서 사용되는 기법이 아니라 데이터를 송수신하는 약속 방식입니다.

 

객체를 JSON으로 변환하는 과정을 직렬화라고 하며, JSON을 객체로 변환하는 과정을 역직렬화라고 합니다.


.NET 4.x Framework인 경우

.NET 5 Framework는 System.Text.Json 네임스페이스에서 JsonSerializer 클래스를 기본으로 제공하기 때문에 객체를 JSON으로 직렬화 또는 역직렬화가 가능합니다.

 

하지만, .NET 4.x Framework인 경우 JSON 직렬화, 역직렬화 기능을 제공하는 클래스를 제공하지 않으므로 NuGet(Mircrosoft 오픈 소스 패키지)에서 Microsoft.Extensions.Configuration.Json를 설치합니다.

 

설치 과정은 Visual Studio 2019 버전으로 정리하였습니다.

 

순서 1.

[도구 → NuGet 패키지 관리자 → 솔루션용 NuGet 패키지 관리...]로 이동하거나

솔루션 탐색기에서 [솔루션 우클릭 → 솔루션용 NuGet 패키지 관리...]로 이동해주세요.

 

순서 2.

[찾아보기] 탭에서 Microsoft.Extensions.Configuration.Json 검색 후 해당 패키지를 사용할 프로젝트를 선택 후 설치하면 됩니다.

 

객체를 JSON으로 직렬화하기 위해 .Net 5 Framework 또는 .Net 4.x Framework 동일하게 using문에 다음 코드를 추가해주세요.

using System.Text.Json;

객체를 JSON 문자열로 변환

다음 코드는 JsonSerializer 클래스의 Serialize() 메서드를 사용하여 객체를 JSON 문자열로 변환합니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person() { Name = "Test", Age = 20 };

        string strJson = JsonSerializer.Serialize<Person>(person);

        Console.WriteLine(strJson);
    }
}

실행 결과

Serialize() 메서드는 제네릭 메서드로 클래스 형식도 JSON 문자열로 변환 가능합니다.


객체를 포멧팅된 JSON 문자열로 변환

위에서 작성한 Serialize() 메서드는 다음 코드처럼 오버로딩된 형태가 존재합니다.

public static string Serialize<TValue> (TValue value, System.Text.Json.JsonSerializerOptions? options = default);

두 번째 매개 변수인 JsonSerializerOptions는 직렬화 옵션입니다.

 

다음 코드는 직렬화 옵션인 WriteIndented을 true로 설정하여 들여 쓰기가 존재하는 JSON 문자열로 변환합니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person() { Name = "Test", Age = 20 };

        string strJson = JsonSerializer.Serialize<Person>(person, new JsonSerializerOptions() { WriteIndented = true });

        Console.WriteLine(strJson);
    }
}

실행 결과


List를 JSON 문자열로 변환

다음은 제네릭 컬렉션인 List도 JSON 배열로 변환할 수 있습니다.

 

제네릭 컬렉션 List를 사용하기 위해 using문에 다음 코드를 추가합니다.

using System.Collections.Generic;

 

다음 코드는 Person 객체를 요소로 하는 List 객체를 JSON으로 변환합니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> listPerson = new List<Person>() {
            new Person() { Name = "Test1", Age = 20 },
            new Person() { Name = "Test2", Age = 25 },
            new Person() { Name = "Test3"}
        };

        string strJson = JsonSerializer.Serialize<List<Person>>(listPerson, new JsonSerializerOptions() { WriteIndented = true });

        Console.WriteLine(strJson);
    }
}

실행 결과


객체를 UTF-8 문자열로 변환

객체를 UTF-8 바이트 배열로 직렬화하는 방식은 SerializeToUtf8Bytes() 메서드를 사용하여 변환할 수 있습니다.

 

일반적으로 웹은 인코딩을 위해 대부분 UTF-8로 표준화되어 있어서 SerializeToUtf8Bytes() 메서드 사용을 권장합니다.

 

Microsoft 공식 문서에서도 Serialize() 메서드 사용은 권장하지 않습니다.

 

다음은 SerializeToUtf8Bytes() 메서드를 사용한 코드입니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> listPerson = new List<Person>() {
            new Person() { Name = "Test1", Age = 20 },
            new Person() { Name = "Test2", Age = 25 },
            new Person() { Name = "Test3"}
        };
        
        byte[] utf8Bytes = JsonSerializer.SerializeToUtf8Bytes(listPerson, new JsonSerializerOptions() { WriteIndented = true });

        string strJson = System.Text.Encoding.UTF8.GetString(utf8Bytes);
        
        Console.WriteLine(strJson);
    }
}

실행 결과


한글로 변환

한글로 변환이 안된다는 댓글이 달려서 확인해봤는데, 다음과 같이 유니코드로 변환되었습니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> listPerson = new List<Person>() {
      new Person() { Name = "한글1", Age = 20 },
      new Person() { Name = "한글2", Age = 25 },
      new Person() { Name = "한글3"}
    };

    byte[] utf8Bytes = 
      JsonSerializer.SerializeToUtf8Bytes(listPerson, new JsonSerializerOptions() { WriteIndented = true });

    string strJson = System.Text.Encoding.UTF8.GetString(utf8Bytes);

    Console.WriteLine(strJson);
  }
}

 실행 결과

[
  {
    "Name": "\uD55C\uAE001",
    "Age": 20
  },
  {
    "Name": "\uD55C\uAE002",
    "Age": 25
  },
  {
    "Name": "\uD55C\uAE003",
    "Age": 0
  }
]

구글에서 "C# jsonserializer unicode"라고 검색하니깐 해결사례가 많이 나왔습니다. 아래는 스택오버플로우의 답변을 참고한 코드입니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> listPerson = new List<Person>() {
      new Person() { Name = "한글1", Age = 20 },
      new Person() { Name = "한글2", Age = 25 },
      new Person() { Name = "한글3"}
    };

    JsonSerializerOptions jso = 
      new JsonSerializerOptions();
      
    jso.Encoder = 
      System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;

    string strJson = JsonSerializer.Serialize(listPerson, jso);

    Console.WriteLine(strJson);
  }
}

실행 결과

[{"Name":"한글1","Age":20},{"Name":"한글2","Age":25},{"Name":"한글3","Age":0}]

정렬이 아쉽긴 하지만, 한글도 정상적으로 변환되었습니다.

반응형

댓글