<다른글>
[c#] JSON 형변환(Json Convert) with JSON.NET
[c#] System.Text.Json 네임스페이스 - JSON Object, Serialize, Deserialize
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 샘플 데이터의 구조는 아래와 같이 되어있습니다.
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
'dev > asp.net, c#' 카테고리의 다른 글
[asp.net core 3.1] 파일 로깅 for nLog(엔로그) (0) | 2020.12.07 |
---|---|
[asp.net core 3.1] 파일 로깅 for log4net(로그4넷) (0) | 2020.12.04 |
[asp.net] 웹사이트 Application_Error 에러(Exception)로깅 with log4net (2) | 2020.11.18 |
[c#] 숫자 및 날짜 서식 지정 (표준형식, 사용자형식) (0) | 2020.11.17 |
[c#] HttpWebRequest , Expect 헤더 100-Continue 이슈 (0) | 2020.11.11 |