ABOUT ME

-

  • Json.NET을 사용해보자!
    Programming/C# 2019. 4. 7. 17:58

    안녕하세요. Teemol입니다.

    오늘은 Json.NET의 사용법을 알아보겠습니다.

     

    Json.NET이란? .Net에서 Json을 처리하는 라이브러리입니다.

     

    먼저 Json.Net을 사용하려면 NuGet을 사용해 Newtonsoft.Json을 설치해야 합니다.

    패키지 관리자 콘솔에서는 Install-Package Newtonsoft.Json로 설치할 수 있습니다.

     

    Json을 처리하기 위한 라이브러리기 때문에 당연히 Json이 필요하겠죠!?

    먼저 아래와 같이 제이슨을 만들겠습니다.


    TestJson.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
     
      "TestJson": {
     
        "DataStr": "Data",
     
        "DataInt": 100,
     
        "DataArry":  ["Arry1", "Arry2", "Arry3"]
     
      } 
     
    }
    cs

    문자, 숫자, 배열 형식의 데이터를 가지고 있는 Json입니다!


    먼저 Key 값을 이용하여 데이터를 가져오는 방법입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
            static void Main(string[] args)
            {
                using (StreamReader r = new StreamReader("TestJson.json"))
                {
                    string json = r.ReadToEnd();
                    ReadJson(json);
                }
            }
     
            static void ReadJson(string jsonStr)
            {
                JObject json = JObject.Parse(jsonStr);
                JToken testJson = json["TestJson"];
     
                string dataStr = testJson.Value<string>("DataStr");
                //dataStr = "Data"
     
                int? dataInt = testJson.Value<int?>("DataInt");
                //dataInt = 100
     
                string[] dataArry = testJson.Value<JArray>("DataArry").Values<string>().ToArray();
                //dataArry[0] = "Arry1", dataArry[1] = "Arry2", dataArry[2] = "Arry3"
            }
    cs

    위와 같이 키값으로 접근해서 데이터를 가져올 수 있습니다.

    이때 주의해야 할 점은, Json에 접근할 때 데이터가 배열 형식이 아닌 경우 Index로 접근할 수 없다는 점입니다.

    쉽게 말하면 샘플 제이슨에서는 인덱스로 접근할 수 있는 항목은 DataArry의 하위 항목뿐입니다.

    TestJson의 하위 항목은 DataStr, DataInt, DataArry는 해당 이름으로만 접근이 가능하고 인덱스로는 접근할 수 없습니다.

    ex) testJson[0] => X, testJson["DataStr"] => O


    혹은 반복문을 이용하여 데이터를 가져올 수 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
            static void Main(string[] args)
            {
                using (StreamReader r = new StreamReader("TestJson.json"))
                {
                    string json = r.ReadToEnd();
                    ReadJson(json);
                }
            }
     
            static void ReadJson(string jsonStr)
            {
                JObject json = JObject.Parse(jsonStr);
                foreach(var data in json["TestJson"])
                {
                    JProperty jProperty = data.ToObject<JProperty>();
     
                    switch (jProperty.Name)
                    {
                        case "DataStr":
                            System.Console.WriteLine(jProperty.Value);
                            //Data
                            break;
     
                        case "DataInt":
                            System.Console.WriteLine(jProperty.Value);
                            //100
                            break;
     
                        case "DataArry":
                            foreach(var arry in jProperty.Value)
     
                                System.Console.WriteLine(arry);
                            //Arry1
                            //Arry2
                            //Arry3
                            break;
                    }
                }
            }
    cs

    지금까지 저는 Json 데이터를 읽을 때 위와 같이 반복 문과 키값을 이용해서 값을 읽고, 처리하였습니다.

    그런데 얼마 전 아는 분이 JsonConvert를 사용하는 걸 봤는데 제가 원시인인 줄 알았네요...


    이제 JsonConvert를 사용해서 데이터를 가져오겠습니다!

    먼저 Json의 내용을 담을 클래스를 만듭니다.

    1
    2
    3
    4
    5
    6
        class TestJson
        {
            public string DataStr;
            public int DataInt;
            public List<string> DataArry;
        }
    cs


    그리고 아래와 같이 JsonConvert.DeserializeObject를 사용하면

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            static void Main(string[] args)
            {
                using (StreamReader r = new StreamReader("TestJson.json"))
                {
                    string json = r.ReadToEnd();
                    ReadJson(json);
                }
            }
     
            static void ReadJson(string jsonStr)
            {
                JObject json = JObject.Parse(jsonStr);
                TestJson testJson = JsonConvert.DeserializeObject<TestJson>(json["TestJson"].ToString());
            }
    cs


    testJson에 값이 들어간 걸 확인할 수 있습니다.

    굉장히 신기하네요!


    아래와 같이 하면 반대로 객체를 Json으로 만들 수도 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            static void Main(string[] args)
            {
                TestJson testJson = new TestJson();
     
                testJson.DataStr = "111";
     
                testJson.DataInt = 222;
     
                testJson.DataArry = new List<string>();
                testJson.DataArry.Add("Arr1");
                testJson.DataArry.Add("Arr2");
     
                string json = JsonConvert.SerializeObject(testJson);
                //{"DataStr":"111","DataInt":222,"DataArry":["Arr1","Arr2"]}
            }
    cs

    정말 간단하죠?


    이렇게 편한 걸 모르고 지금까지 하나하나 읽어서 클래스에 담다니 정말 멍청했네요 ㅠ

    이제부터라도 자주 사용해야겠습니다.


    여기까지, 간단하게 Json.NET의 사용법을 알아봤습니다.


    감사합니다.


    'Programming > C#' 카테고리의 다른 글

    [WPF] WindowChrome !  (0) 2020.03.20
    [WPF] ListView에 UserControl 넣기  (0) 2020.03.20
    [WPF] 의존 프로퍼티!?  (0) 2019.03.08
    [WPF] ListView에 데이터를 바인딩 해보자!  (0) 2019.03.07
    데이터처리를 쿼리로!? (1)  (0) 2019.03.05

    댓글

Designed by Tistory.