웹 서버와 통신하는 서비스라면 JSON을 사용하게 됩니다. 그렇기 때문에 구조화된 데이터를 적절하게 변경하여서 사용 해야하는 경우도 빈번하게 일어납니다. 앱에서도 통신 할 때도 일반적으로 JSON을 사용하게 됩니다.
인코딩, 직렬화
는 자료구조
⇒ 문자열
변환 합니다.디코딩, 역직렬화
는 문자열
⇒ 자료 구조
로 변환하는 반대 과정입니다.직렬화는 일반적으로 자료구조를 보다 읽기 쉬운 형태로 변환
하는 과정을 말하기도 합니다.
데이터 구조를 읽기 쉬운 형식으로 변환하여서 사용한다면 읽기 쉬운 형태로 변환할 수 있을 뿐만 아니라
인스턴스 내부에 잘못된 값들을 입력할때 디버깅을 하는데에도 용이 합니다.
패키지 dart:convert를 이용해 수동으로 JSON을 직렬화하였습니다.
아래의 코드는 Flutter에서 직렬화, 역직렬화를 하는 과정에서 사용되는 함수들에 들어가는 인자들의 타입(Map, 인스턴스, 문자열)에 따라 어떤 결과값이 나오는지 정리한 코드입니다.
import 'package:flutter/material.dart';
import 'dart:convert'; // jsonDecode 관련 패키지
class User {
final String name;
final String email;
User(this.name, this.email);
User.fromJson(Map<dynamic, dynamic> json)
: name = json['name'],
email = json['email'];
Map<String, dynamic> toJson() => {
'name': name,
'email': email,
};
}
void main() {
runApp(const MyApp());
var userInstance = User('홍길동', 'gildong@example.com');
print('userInstance User() - instance of User');
print(userInstance.name); // 홍길동
print(userInstance.email); // gildong@example.com
print(userInstance); // Instance of User
print(userInstance.runtimeType); // User
var userString = jsonEncode(userInstance);
print('userString jsonEncode() - String');
print(userString); // {"name":"홍길동","email":"gildong@example.com"}
print(userString.runtimeType); // String
Map userMap = jsonDecode(userString);
print('userMap jsonDecode() - _InternalLinkedHashMap<String, dynamic>');
print(userMap); // {name: 홍길동, email: gildong@example.com}
print('안녕하세요, ${userMap['name']}님!');
print('${userMap['email']}으로 인증 링크를 보냈습니다.');
print(userMap.runtimeType); // _InternalLinkedHashMap<String, dynamic>
var userFromJson = User.fromJson(userMap);
print('userFromJson fromJson - User');
print(userFromJson); // Instance of User
print(userFromJson.name); // 홍길동
print(userFromJson.email); // gildong@example.com
print(userFromJson.runtimeType); // User
}