BOID
[iOS] 데이터 포맷(JSON방식) 2 / 2 - HoonIOS 본문
안녕하세요 HoonIOS입니다. :)
저번 포스팅에는 데이터 포맷 방식 중 하나인 XML방식에 대해 포스팅을 했었습니다.
그렇다면 이번에는 XML보다 더 많이 사용하고 있는 방식인 JSON방식에 대해 포스팅을 하려고 합니다.
JSON방식을 많이 사용하는 이유는 XML보다 용량이 줄어들기도 하고 빠른 속도를 가지고 있기 때문입니다.
JSON 방식
JSON은 JavaScript Objcet Notation의 약자로 자바스크립트 언어에서 사용되었다고 합니다.
( 그렇다네요... 저는 자바스크립트를 공부하지 않았어 가지고 혹시, 자바스크립트를 배우신 분이라면 이해 실 때 도움되실 거 같습니다. :) )
JSON방식은 텍스트 기반 데이터 구조 자리로 JSON 데이터 구조로는 크게 두 가지가 있습니다.
- JSON 객체 - 여러 가지 속성을 다양하게 정의할 수 있는 순서가 없는 집합구조
- JSON 배열 - 비슷한 형식이 반복되는 순서가 있는 리스트 구조
이름 | 형식 |
JSON 객체 | { 키: 값, 키: 값 ... } |
JSON 배열 | [ 객체1, 객체2, 객체3... ] |
그럼 JSON객체, JSON배열에 대해 한번 다뤄보도록 하겠습니다.
JSON 객체
JSON 객체는 {키: 데이터} 형태로 이루어진 딕셔너리 데이터 집합으로 중괄호 { 로 시작해서 }로 끝나는 것으로 데이터 값을 볼 때 구분을 해야 합니다.
딕셔너리 집합 구조를 보면 키에는 키워드 값이 들어가고 오른쪽 데이터에는 그에 대한 데이터 내용 값이 들어갑니다.
중괄호 사이의 { : }로 나누어져 있는 두 개는 한쌍으로 이루어져 있어 키에 대한 데이터 값을 불러올 수 있습니다.
이웃한 키와 데이터를 구분할 때는 쉼표( , )로 구분을 합니다.
{ 키 : 값 , 키 : 값 }
JSON객체에는 문자열 이외에 정수나 실수, 논리 값도 사용을 할 수 있으며 실수 값, 정수 값은 큰따옴표를 붙이지 않고 오직 문자열에만 큰 따옴표를 붙여줍니다.
( 이렇게 큰 따옴표를 붙여서 처리하는 것을 쿼우팅이라고 하는데, 큰따옴표는 더블쿼우팅, 작은따옴표는 싱글쿼우팅이라고 붙여줍니다. )
※ 주의
XML 포스팅을 할 때는 문자열에 큰따옴표를 넣어주지 않아도 된다고 했지만 JSON은 문자열을 사용할 때 큰따옴표를 표시해줘야 하는 차이가 있으니 주의해야 합니다.
API에서 받아온 영화 정보 데이터가 JSON형태로 받았을 때를 예를 들어서 설명해 보겠습니다.
{ "title" : "다크 나이트" }
* 설명
- 이것은 객체 안에 데이터 하나만 들어왔을 때의 예시입니다.
그럼 한 객체 안에 데이터가 2개 있을 때는 어떻게 될까요?
{ "title" : "다크 나이트", "description" : "영웅에 액션까지" }
* 설명
- 데이터가 2개가 들어가 있으면 이렇게 쉼표로 구분을 해줘야 합니다. 만약 한 객체 여러 개의 데이터를 계속 추가하고 싶으면 쉼표로 구분해서 추가를 해주면 됩니다.
단! JSON방식을 사용하면 데이터가 점점 많아져서 가독성이 떨어지므로 조심해야 합니다.
그래서 이렇게 쭈-----욱 나열을 하는 것보다 아래와 같이 개발자가 보디 좋게 데이터를 정렬하는 게 좋습니다. 왜냐하면 훨씬 데이터가 잘 보이거든요 ㅎㅎ
{
"title" : "다크 나이트", "description" : "영웅에 액션까지"
}
JSON 객체는 복잡한 데이터를 그룹으로 묶어서 계층화를 구현할 수 있습니다. 계층화로 그룹화하는 예시를 한번 살펴보겠습니다.
{
"title" : "다크 나이트",
"description" : "영웅에 액션까지",
"rating - 20age" : 8.7,
"rating - 30age" : 9.6,
"rating - 40age" : 7.0,
"rating - 50age" : 8.9,
"rating - 60age" : 8.2
}
이 JSON 파일을 그냥 보고있으면 하 뭔가 rating을 기준으로 다시 정리해주고 싶다... 뭔가 더럽다...라는 생각을 하셨을 텐데요 그래서 rating을 연령별로 JSON객체를 계층적 구조로 아래에 넣어볼 수 있습니다. :)
{
"title" : "다크 나이트",
"description" : "영웅에 액션까지",
"rating" : {
"20age" : 8.7,
"30age" : 9.6,
"40age" : 7.0,
"50age" : 8.9,
"60age" : 8.2
}
* 설명
- 위 JSON코드를 보면 rating JSON 데이터 안에 JSON파일을 계층적으로 구분한 것을 확인할 수 있습니다.
- 이런 형태의 장점은 형식을 구분할 때 성격에 따라 데이터를 계층적으로 구분을 할 수 있어서 높은 수준으로 구조화된 데이터를 만들 수 있습니다.
JSON 데이터는 대부분 프로그래밍 언어에서 제공하는 자료구조와 호환이 가능하고 또, JSON 데이터는 각 언어에서 제공하는 자료형으로 변환을 해서 사용할 수 있습니다.
스위프트는 위에서 딕셔너리 자료형으로 제공되는데 딕셔너리의 특징은 동일 한 타입의 데이터만 저장할 수 있는 제약이 있습니다.
예를 들어 첫 번째 추가한 항목의 데이터 타입이 문자열이었으면 그다음에 추가되는 데이터 내용도 문자열이어야 합니다.
이 부분에서 의문점이 생깁니다. 위의 예시에서 보면 title, description키는 문자열을 가지는데 rating은 실수 타입으로 되어 있어 저장이 안 될 텐데?라는 의문점을 가지고 타입을 강제로 문자열로 변환해서 데이터 타입을 문자열로 바꾸고 값을 변형하는 방법이 있는데 이 방법은 값을 버리는 결과를 가져올 수 있어 좋은 방법은 아닙니다.
따라서 딕셔너리보다는 딕셔너리와 비슷한 NSDictionary, NSMutableDictionary자료형을 사용하는 게 좋습니다.
이 두 개의 자료형의 장점은 다양한 형태의 데이터 타입도 허용을 하고 JSON 데이터로 전달하는 값들이 키에 따라 데이터가 다르더라도 문제없이 저장을 할 수 있습니다.
이 자료형들은 파운데이션 프레임워크를 통해 제공되므로 파운데이션 프레임워크를 임포트 시켜야 합니다.
NSDictionary, NSMutableDictionary의 자료형의 차이는 무엇일까요?
자료형 | 특징 |
NSDictionary | 한번 데이터가 정의되고 나면 새로운 데이터를 CRUD 할수 없습니다. |
NSMutableDictionary | 한번 데이터가 정의되고 나도 새로운 데이터를 CRUD 할수 있습니다. |
* 설명
- 한 번에 이해하기 어려우시면 구조체에서 내부 값을 바꿀 때 사용하는 Mutable을 생각하시면 둘의 비교가 이해시길 편하실 겁니다.
JSON객체에 대해 포스팅해봤고 이제 다른 JSON방식 중에 하나인 JSON배열에 대해 알아보겠습니다.
JSON 배열
JSON 배열은 구조 형태가 리스트 배열 구조로 [ 아이템, 아이템,...] 형태로 이루어진 배열 형태입니다.
여기서 JSON배열 내부에 들어가는 항목을 아이템이라고 합니다.
JSON 객체는 영화 하나의 데이터를 제공할 때 유용하지만 최근 개봉 영화, 영화 인기순위같이 여러 개의 정보를 목록으로 보여줄 때 유용하게 사용됩니다.
이것은 JSON 객체와 다르게 리스트 구조로 되어있어 배열들이 순서를 가지는 집합들입니다.
[" ", " ", " "]로 데이터를 나열을 하는 것으로 나열된 각각의 데이터는 쉼표로 구분을 합니다.
문자열, 숫자, 논리 값을 나열할 수 있고 JSON객체나 JSON배열 자체를 나열할 수도 있습니다.
간단한 예시를 몇 개 들어서 설명해보겠습니다.
* 예시
- [1, 2, 3, 4, 5]
- ["a","b","c","d","e"]
- [
["a","b","c","d","e"],
["A","B","C","D","E"],
["가","나","다","라","마"]
] - [
{ "title" : "다크나이트" },
{ "title" : "엔트맨" },
{ "title : "엑스맨" }
]
배열 안에 객체가 들어갈 때 꼭 항목이 같아야 하는 것은 아닙니다.
- [
{ "title" : "다크나이트" },
{ "title" : "엔트맨", "description" : "개미 인간과 악당이 싸우는 영화~!" },
{ "title : "엑스맨" }
]
대신 이런 구조는 좋은 구조는 아닙니다. 왜냐하면 데이터를 받아 파싱을 해야 하는데 description은 한군대에만 정의 되어 있어서 따로 예외처리를 해줘야 하기 때문입니다.
따라서 아래와 같이 일괄되게 통일해주는 것을 추천드립니다.
- [
{"title" : "다크나이트, "description" : "" },
{"title" : "엔트맨", "description" : "개미 인간과 악당이 싸우는 영화~!" },
{"title" : "엑스맨", "description" : "" }
]
이렇게 키값을 모두 일괄되게 맞추는 것이 좋습니다. :)
JSON 배열하고 JSON객체를 같이 병합해서 사용을 할 수 있습니다.
JSON배열과 JSON객체
JSON 배열의 아이템 안에 JSON객체를 위에서 사용했던 것처럼 JSON객체의 항목 값을 JSON 배열 안에 넣을 수 있습니다.
데이터를 전달할 때 단순히 JSON 데이터를 전달하기보다는 데이터의 전체 개수, 데이터 종류에 대한 정보를 함께 전달해야 합니다.
이럴 때는 JSON객체로 메타정보를 구성하고 JSON배열을 집어넣어 형태를 만들 수 있습니다.
어떤 형태인지 아래 한번 설명해보겠습니다.
{
"MoviewDataCount" : 3,
"section" : "movie",
"row" : [
{
"title" : "다크 나이트",
"description" : "영웅에 액션까지",
"opendate" : "2008-09-04",
"thumbnail" : ". jpg"
},
{
"title" : "엔트맨",
"description" : "개미 인간과 악당이 싸우는 영화~!" ,
"opendate" : "2018-07-04",
"thumbnail" : ". jpg"
}
"title" : "21",
"description" : "수학 천재들이 라스베이거스에서 도박을 하면 벌어지는 일들!"
"opendate" : "2008.06.19",
"thumbnail" : ". jpg"
}
]
}
* 설명
- row 객체 안에 각 영화들의 배열들이 들어가 있습니다. 따라서 해당 배열을 통해서 세안에 데이터를 하나씩 넣을 수 있는 형태를 구현할 수가 있습니다.
이형태를 다음 오픈 API를 이용해 구현해보는 실습을 통해 알아보겠습니다.
JSON은 앞으로 네트워크 통신을 할 때 많이 보는 데이터 형식으로 상당히 중요한 부분이라 여러 번 봐야 될 거 같습니다. 이번 포스팅을 통해 공부를 하여 JSON 배열, 객체 개념을 다시 다질 수 있는 기회가 되었습니다.
'IOS 시작기' 카테고리의 다른 글
[iOS] 컬렉션뷰의 델리게이트 & 데이터소스 뽀시기 - HooniOS (0) | 2021.05.04 |
---|---|
[iOS] 컬렉션 뷰란 - HoonIOS (0) | 2021.05.04 |
[iOS] 데이터 포맷(XML방식) 1 / 2 - HoonIOS (0) | 2021.05.01 |
[iOS] 비연결 지향 통신(SOAP, RESTful 프로토콜 방식) - HoonIOS (0) | 2021.04.30 |
[iOS] 연결 지향 통신이란? (0) | 2021.04.30 |