dev/asp.net, c#

[c#] JSON.NET 을 이용한 Json 데이터 파싱 - Json Key Name 가져오기 (JObject, JToken)

코딩for 2020. 11. 27. 09:07
반응형

<다른글>

[c#] JSON 형변환(Json Convert) with JSON.NET

 

[c#] JSON 형변환(Json Convert) with JSON.NET

어떤 언어든 코딩을 하면서 많이 사용하는것 중의 하나가 JSON 입니다. C# 에서는 JSON 을 사용할때 가장 많이 이용하는 것 중의 하나가 바로 JSON.NET 으로 내장객체인 JavaScriptSerializer 보다 더욱 성능

askforyou.tistory.com

[c#] System.Text.Json 네임스페이스 - JSON Object, Serialize, Deserialize

 

[c#] System.Text.Json 네임스페이스 - JSON Object, Serialize, Deserialize

System.Text.Json .Net 에서 JSON Object 를 다루기 위해서 대부분 Newtonsoft.Json 패키지를 이용하여 JSON 작업을 하였다. 하지만 .net core 3.0 버전부터 추가가 되면서 점차 그 영역을 확장하고 있다. NewtonSoft.Jso

askforyou.tistory.com

 

 

JSON 데이터의 key 네임이 고정된 값이 아닌 변경이 된다 하면 class 모델로 Serialize를 할 수 없습니다.(다른 방법이 있는지는 모르겠습니다.) 따라서 json 데이터를 직접 parsing 해야 하는 경우가 생기며, Serialize 하기 어려운 경우 또한 parsing 을 하여 json 데이터에 직접 접근을 해야 합니다.

 

Json 데이터 파싱하기

// json 데이터

{
    "book": {
        "bookcode-2": {
            "book": [
                [
                    {
                        "title": "c# 끝내기",
                        "author": "김영수"
                    }
                ]
            ]
        },
        "bookcode-10": {
            "book": [
                [
                    {
                        "title": "c# 2",
                        "author": "박대기"
                    }
                ]
            ]
        }
    }
}

json 샘플 데이터의 구조는 아래와 같이 되어있습니다.

json 데이터 구조

 

1. JObject 타입의 key Name으로 접근

기본적으로 JSON Key 를 이용한 데이터 접근은 각각의 순차적인 키로 접근이 가능합니다.

에제에서는 string 형식의 json 데이터를 parse를 이용하여  json 객체 형태(JObject)로 먼저 변환시켜 줍니다.

            var jsonStr = @"{
                'book': {
                    'bookcode-2': {
                            'book': [
                                [
                                    {
                                        'title': 'c# 끝내기',
                                        'author': '김영수'
                                    }
                            ]
                        ]
                    },
                    'bookcode-10': {
                            'book': [
                                [
                                    {
                                        'title': 'c# 2',
                                        'author': '박대기'
                                    }
                            ]
                        ]
                    }
                }
            }";
            
// 샘플의 json스트링을 json 객체타입(JObject) 타입으로 읽어들인다.            
JObject json = JObject.Parse(jsonStr);   

Console.WriteLine("==json key 를 이용하여 접근==");
var jsonKey =  json["book"]["bookcode-10"]["book"];
foreach(var j1 in jsonKey)
{
	foreach(var j2 in j1)
	{
		Console.WriteLine(j2["title"].ToString());
		Console.WriteLine(j2["author"].ToString());
	}
}

 

* 이처럼 bookcode-10  의 키로 쉽게 접근이 가능합니다.

하지만 Key Name이 가변적으로 변경되는 경우(bookcode-2, bookcode-10 같이 변경이 될 때)처럼 key 네임으로 직접 접근이 어렵거나, 또는 key 네임을 읽어야 하는 경우는 key 네임으로 접근이 불가하기 때문에 json을 순차적으로 파싱 하며 key 네임을 읽어야 합니다.

 

 

2. Json.net 을 이용한 Json 파싱 하기

Key의 Name 값은 JProperty 라는 객체에서 가지고 있기 때문에 JObject 타입을 JProperty로 타입 변환을 한 이후에 Name 값에 접근할 수 있습니다.

// json.net 을 참조 추가해준다.
using Newtonsoft.Json.Linq;


// json.net 을 이용한 json 파싱

JToken jt = json["book"];

Console.WriteLine("book Count :" + jt.Count());
Console.WriteLine("===== parse 시작 =====");

foreach(JProperty j in jt)
{
	Console.WriteLine("key name : " + j.Name);

	foreach(var book in j.Value["book"])
	{
		foreach(var bk in book)
		{
			Console.WriteLine("book title > " + bk["title"]);
			Console.WriteLine("book author> " + bk["author"]);
		}
	}

	Console.WriteLine("---------");
}

Console.WriteLine("===== parse 완료 =====");

 

JObject 타입의 book을 JToken 으로 변환한 후 반복문을 이용하여 JToken 의 각각의 데이터를 JProperty 로 읽어 JProperty 속성의 Name, Value 값을 추출합니다.

순차적으로 하위 레벨까지 돌아가며 모든 json 데이터에 추출할 수 있습니다.

 

 

* JSON.NET Documentation참고 

https://www.newtonsoft.com/json/help/html/N_Newtonsoft_Json_Linq.htm

 

 

 

반응형