본문 바로가기
Programming/C# & .NET

[C#] JSON, JArray 직렬화, 역직렬화 간단 방법 (Newtonsoft.Json)

by Kor-IT 2022. 6. 30.
반응형

Newtonsoft Json

 

 

소개 및 의미

API 통신을 하다 보면 대부분 JSON 형식으로 많이 주고받는다. JSON을 C#에서 직렬화, 역직렬화 하여 사용하는 경우가 많은데 글쓴이는 'Newtonsoft.Json'을 이용해서 잘 사용하고 있다. 해당 글을 통해 쉽게 직렬화, 역직렬화 하는 방법을 알았으면 바란다.

 

직렬화? 역직렬화?
 

직렬화는 객체를 전송 가능한 형태로 만든다는 의미이다. 여기서는 JSON 을 직렬화한다는 표현은 JSON 형태로 만든다는 의미이다. 반대의 의미인 역직렬화는 직렬화된 형태를 다시 객체의 형태로 만드는 것이다.

직렬화는 Serializtion 이라 부르고 역직렬화는 Deserialization이라고 부른다.

 

 

 

직렬화, 역직렬화

해당글에서의 기본 베이스는 'Newtonsoft.Json'을 기본으로 하기 때문에 'Newtonsoft.Json'의 네임스페이스가 필요하다.

using Newtonsoft.Json;

 

예시를 들기위해 User 클래스를 만든다.

class User
{
    public int id { get; set; }
    public string name { get; set; }
}

 

 

직렬화 (Serializtion)

클래스(Class)를 직렬화 하기

User user = new()
{
    id = 1,
    name = "홍길동"
};

string jsonData = JsonConvert.SerializeObject(user);

Console.WriteLine(jsonData);
[출력]

{"id":1,"name":"홍길동"}

새롭게 만든 User 클래스를 인스턴스하여 직렬화 한 결과이다. 필드명이 Json 구조의 Key로 가며 값은 Json 구조의 Value로 이루어진 Json 형태 구조로 되었다.

 

 

List를 직렬화 하기

리스트 형식을 JArray 형식으로 직렬화하는 방법이다. JsonConvert.SerializeObject를 사용하는 방법과 JArray를 사용하는 방법이 있다.

List<User> users = new()
{
    new User
    {
        id = 1, name = "홍길동"
    },

    new User
    {
        id = 2, name = "이순신"
    }
};

 

1. JsonConvert.SerializeObject()

string data = JsonConvert.SerializeObject(users);
[출력]

[ { "id": 1, "name": "홍길동" }, { "id": 2, "name": "이순신" } ]

 

2. JArray.FromObject()

Newtonsoft.Json.Linq 네임스페이스를 추가한다.

using Newtonsoft.Json.Linq;
string data = JArray.FromObject(users).ToString();
[출력]

[ { "id": 1, "name": "홍길동" }, { "id": 2, "name": "이순신" } ]

 

 

 

역직렬화 (Deserialization)

JObject로 역직렬화 하기

Newtonsoft의 Json Object 가 있는데 그게 바로 JObject이다. JObject는 자세하게 따로 다루겠다. 해당 글에서는 역직렬화하는 방법을 알아 둘 것이다. Newtonsoft.Json.Linq 네임스페이스를 추가한다.

using Newtonsoft.Json.Linq;
string data = @"{'id':1,'name':'홍길동'}";

JObject jobj = JObject.Parse(data);

Console.WriteLine($"id : {jobj["id"]} / name : {jobj["name"]}");
[출력]

id : 1 / name : 홍길동

 

 

클래스(Class)로 역직렬화 하기

string data = @"{'id':1,'name':'홍길동'}";
            
User user = JsonConvert.DeserializeObject<User>(data);

Console.WriteLine($"id : {user.id} / name : {user.name}");
[출력]

id : 1 / name : 홍길동

Json 형태를 User 클래스로 역직렬화한 결과다. 동일하게 Json의 Key는 필드와 동일하다면 자동적으로 매핑된다.

 

 

JArray로 역직렬화 하기

using Newtonsoft.Json.Linq;
string data = "[ { 'id' : 1, 'name': '홍길동' }, { 'id': 2, 'name': '이순신' } ]";

JArray jArray = JArray.Parse(data)

foreach (JObject keyValues in jArray)
{
    Console.WriteLine($"id : {keyValues["id"]} / name : {keyValues["name"]}");
}
[출력]

id : 1 / name : 홍길동
id : 2 / name : 이순신

JArray의 Parse() 메서드를 사용하여 역직렬화를 할 수 있다. JObject의 Array 이기 때문에 Key를 통해 Value 값을 가져올 수 있다.

 

 

List<T> 역직렬화하기

string data = "[ { 'id' : 1, 'name': '홍길동' }, { 'id': 2, 'name': '이순신' } ]";

List<User> users = JsonConvert.DeserializeObject<List<User>>(data);

foreach(User user in users)
{
    Console.WriteLine($"id : {user.id} / name : {user.name}");
}
[출력]

id : 1 / name : 홍길동
id : 2 / name : 이순신

DeserializeObject<T> 의 형식 안에 List<T> 를 담아 List 형식으로 역직렬화가 가능하다. 개인적으로 해당 형식을 더 선호하는 편이다.

 

 

반응형

댓글