C#

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

Dev Story 2021. 9. 26.

이번 포스팅에서는 역직렬화(Deserialize)를 사용하여 JSON 문자열을 객체로 변환하는 방법을 정리하였습니다.

 

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

 

이번 포스팅은 네트워크 통신을 통해서 JSON 데이터를 가져오도록 하였으며, API 요청부터 응답받은 JSON 데이터를 객체로 변환하는 과정을 다룹니다.

 


무료 API 사이트

API 요청을 하고 JSON 데이터를 가져오기 위해서는 "어디에 요청을 할 것인지?" 결정해야 합니다.

 

조건이나 제약 없이 API 통신이 가능하고 JSON 데이터를 보내주는 곳을 찾기 위해 구글에 json free api라고 검색합니다.

 

여러 사이트가 조회되는데, 빨간 테두리로 표시된 사이트를 추천합니다.

☞ 사이트 이동하기

무료로 API 테스트 가능한 목록이 50개 있습니다.

 

여기서 2번째 URL을 접속합니다.

URL을 접속하면 다음 사진처럼 JSON 데이터가 화면에 출력됩니다.

이렇게 무료 API 사이트를 잘 활용한다면, API 통신과 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;

API 요청

저는 HttpWebRequest 클래스를 사용하여 API 요청을 하는 코드를 작성했기 때문에 using문에 아래 코드를 추가합니다.

using System.Net;
using System.IO;

 

다음은 API 요청 후 응답받은 값(JSON 데이터)을 string으로 변환하는 코드입니다.

 

이번 포스팅은 JSON을 객체로 변환하는 것이 핵심이므로 세부적인 내용은 생략합니다.

class Program
{
    // API 요청하면 JSON Data를 string으로 반환하는 로직을 메서드로 구현합니다.
    private static string GetJsonData(string url)
    {
        string responseText = string.Empty;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.Timeout = 30 * 1000; // 30초

        using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
        {
            HttpStatusCode status = resp.StatusCode;

            Stream respStream = resp.GetResponseStream();
            using (StreamReader sr = new StreamReader(respStream))
            {
                responseText = sr.ReadToEnd();
            }
        }
        return responseText;
    }

    static void Main(string[] args)
    {
        // SampleURL을 작성합니다.
        string URL = "https://api.agify.io/?name=bella";
        
        // GetJsonData 메서드에 URL을 전달합니다.
        string jsonData = GetJsonData(URL);

        Console.WriteLine(jsonData);
    }
}

실행 결과

Main문에 모든 코드를 작성하면 코드가 길어져서 가독성이 떨어지므로 API 요청을 하는 코드는 GetJsonData()라는 메서드로 구현하였습니다.

 

GetJsonData() 메서드에 URL을 전달하면 JSON 데이터를 string으로 반환합니다.


JSON을 객체로 변환

JSON을 객체로 변환하기 위해 클래스의 멤버 변수의 이름은 JSON의 속성 이름과 동일해야 합니다.

 

JSON의 속성 이름과 동일한 멤버 변수의 이름을 가진 Person 클래스를 구현합니다.

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public int count { get; set; }
}

 

다음 코드는 JsonSerializer 클래스의 Deserialize() 메서드를 사용하여 JSON 문자열을 Person 클래스의 인스턴스로 변환합니다.

static void Main(string[] args)
{
    string URL = "https://api.agify.io/?name=bella";
    string jsonData = GetJsonData(URL);

    Person personObj = JsonSerializer.Deserialize<Person>(jsonData);

    Console.WriteLine($"Person name: {personObj.name}");
    Console.WriteLine($"Person age: {personObj.age}");
    Console.WriteLine($"Person count: {personObj.count}");
}

실행 결과


JSON의 속성을 Class로 변환

위 URL에서 제공하는 JSON은 간단한 구조로 되어있어서 클래스를 직접 구현할 수 있었습니다.

 

하지만, JSON 구조가 다음 사진처럼 복잡하게 구성되어 있다면, 클래스로 구현하는 것은 쉬운 작업이 아닙니다.

 

이렇게 복잡한 JSON을 Class로 구현하기 위해서는 애플리케이션을 개발하던가 아니면 온라인에서 제공하는 JSON을 Class로 변환해주는 사이트를 이용합니다.

 

JSON을 Class로 변환해주는 사이트를 접속하기 위해 구글에 json to class c#이라고 검색합니다.

 

저는 최상단에 조회되는 json2csharp 사이트를 이용하였습니다.

좌측에 JSON 데이터를 넣고 Convert 버튼을 클릭하면 우측에 변환된 Class를 확인할 수 있습니다.


복잡한 구조의 JSON을 객체로 변환

이번에는 JSON 구조가 복잡한 URL 사이트를 이용하였습니다.

 

Sample URL 사이트로 이동하여 JSON 데이터를 복사합니다.

복사한 JSON 데이터를 JSON을 Class로 변환하는 사이트에서 변환합니다.

변환된 클래스를 복사하여 사용합니다.

 

다음은 JSON을 Root 클래스의 인스턴스로 변환한 코드입니다.

static void Main(string[] args)
{
    string URL = "https://api.imgflip.com/get_memes";
    string jsonData = GetJsonData(URL);

    Root rootObj = JsonSerializer.Deserialize<Root>(jsonData);
}

실행 결과

데이터가 많아서 Console에 출력이 어렵기 때문에 조사식에서 확인하였습니다.

 

반응형

댓글0