Dart의 JSON Encoding, Decoding
Dart의 JSON 처리 방법을 배워봅시다.
JSON이란?
서버와 클라이언트가 서로 데이터를 주고받을 때,
서버나 클라이언트가 사용하는 언어나 프레임워크와 관계없이,
동일한 데이터를 받을 수 있으려면 데이터를 주고받는 형식을 일치시킬 필요가 있습니다.
이 때, 많은 곳에서 데이터의 형식으로, JSON(Javascript Object Notation)을 사용하고 있습니다.
아래는 JSON의 예시입니다.출처1
{
"이름공간(키)": "값",
"값 구분자": "각각의 값들은 ',' (콤마)로 구분되어야 합니다.",
"이스케이프": "키나 값에서 큰따옴표를 쓰고 싶으면-특정 문자를 이스케이프 하려면- \" 처럼 문자 앞에 역슬래시를 붙입니다.",
"자료형": "표현 가능한 자료형은 문자열, 숫자, 불리언, 널, 객체, 배열 6개입니다.",
"문자열 값": "나무위키, 여러분이 가꾸어 나가는 지식의 나무",
"숫자 값": 19721121,
"불리언 값": true,
"널 값": null,
"객체 값": {
"값1": 3.141592653589793,
"값2": false,
"값3": {
"객체 안에": "객체를 넣는것도 가능하지요",
"구분자": "또한 키와 값은 ':' 로 구분됩니다"
}
},
"배열 값": [
"이것은 배열입니다.",
{
"현재 값의 인덱스": 1,
"이런 식으로": "배열 안에 여러 값을 넣을 수 있습니다."
},
[ "배열", "안에", "배열을", "넣는것도", "가능하지요" ]
],
"값의 개수가 적을때는": "다음과 같이 한 줄로도 객체와 배열 표현이 가능합니다.",
"한 줄 객체": { "김두한": "개소리 집어쳐", "심영": "내가 고자라니", "의사양반": "전화는 없어요" },
"한 줄 배열": [ "나무위키는", "누구나", "기여할", "수", "있는", "위키입니다." ]
}
모양과 규칙이 단순해서 여러가지 언어에서 구현하기 쉽고, 사람이 알아보기도 쉽기 때문에 자주 사용됩니다.
Encoding과 Decoding
JSON을 다룰 때, 함께 많이 다루는 용어로 Encoding과 Decoding이 있습니다.
이름에서 알 수 있듯이 둘은 서로 반대의 의미를 가지고 있습니다.
Encoding은 "특정 형태 또는 코드로 정보를 변환한다"는 뜻을 가지고 있습니다.
여기서 특정 형태는 JSON이 되겠네요.
다시 말해, 언어나 프레임워크에서 사용하는 자료형(Int, Double, Dictionary 등)을 JSON 형태로 변환하는 것을 의미합니다.
여기서 특히 JSON처럼 데이터 운반에 사용되는 형태로 변환하는 경우 Serialization(직렬화)라고 부르기도 합니다.
Decoding은 그와 반대로, Encoding이 완료된 데이터를 원래의 정보로 변환하는 작업을 의미합니다.
JSON으로 인코딩된 데이터를, 언어나 프레임워크에서 사용하는 자료형으로 변환하는 작업을 의미합니다.
Encoding과 마찬가지로, 데이터 운반에 사용되는 형태에서 변환해 오는 경우 Deserialization(역직렬화)라고 부르기도 합니다.
Dart의 JSONEncode / JSONDecode
Dart의 convert라는 라이브러리에는, JSON의 인코딩과 디코딩을 쉽게 수행할 수 있는 함수들이 내장되어 있습니다.
JSONEncode의 예시부터 살펴보겠습니다.
import 'dart:convert'; // JSONEncode의 사용을 위해 import가 필요합니다.
void main() {
var datas = [
{
'name': 'CodeCamper',
'age': 25,
},
{
'name': 'mekind',
'age': 26
}
];
String jsonText = jsonEncode(datas);
print(jsonText);
}
위 코드를 실행해보면, JSON의 형태로 바뀐 데이터를 확인할 수 있습니다.
[{"name":"CodeCamper","age":25},{"name":"mekind","age":26}]
얼핏보면 var datas
로 정의된 부분과 똑같이 나오는 것 아니냐고 생각하실 수 있습니다.
하지만 datas는 Dart에서 사용하는 자료형 List, Map, String, Int 자료형을 사용하는 반면,
jsonText는 String 자료형만을 사용하는 것을 확인할 수 있습니다.
언어 / 프레임워크에서 사용하는 여러 자료형들로 표현된 정보가,
다른 프레임워크나 언어에서도 쉽게 사용 가능한 JSON 문자열 형태로 변환되었다고 볼 수 있습니다.
다음은, JSONDecode입니다.
사용법은 JSONEncode와 크게 다르지 않습니다.
import 'dart:convert';
void main() {
String jsonText = '''
[{"name":"CodeCamper","age":25},{"name":"mekind","age":26}]
'''
var datas = jsonDecode(jsonText);
print(datas[0]); // {name: CodeCamper, age: 25}
var codeCamper = datas[0];
print(codeCamper['name']); // CodeCamper
}
String(문자열) 형태였던 JSON이 Dart의 List<Map>
형태로 변환된 것을 확인할 수 있습니다.