본문 바로가기
프로그래밍/Flutter

[flutter] Dart, JSON 수동 직렬화(Serialization) 하기

by 신나요 2022. 5. 17.

프로그래밍 언어와 상관없이 json 문자열 포맷으로 API 통신을 하는 경우가 많습니다. 다트와 플러터에서도 JSON 데이터를 다루기 위해 편리한 기능을 갖추고 있는데요. Dart에서 JSON 데이터를 다루는 방식으로 수동 직렬화와 자동 직렬화로 나눌 수 있습니다. 첫 번째 시간으로 수동으로 직렬화 하는 방식을 알아보도록 하겠습니다.

 

이번 포스트는 다음 내용을 다루고 있습니다.

  • 플러터(다트)에서 json 직렬화 과정
  • 직렬화(Serialization) 실습

플러터(다트)에서 json 직렬화 과정

코드에 앞서 직렬화하는 과정을 살펴보겠습니다. 수동으로 직렬화 하는 과정은 매우 간단합니다. 유저를 나타내는 Dart 클래스로 예를 들어보겠습니다. 

json 직렬화 하는 단계

1. 먼저 User클래스로 User객체를 생성하게 됩니다.

2. 다음 단계로 하나의 유저를 나타내는 객체를 가지고 Map을 만들게 됩니다. Map에는 키와 값을 가지는 구조로 JSON 객체의 유효한 값을 허용하는 동적(dynamic) 값과 문자열(String)인 키가 있습니다. 맵을 생성하는 권장 방법은 맵 리터럴 구문을 사용하는 것입니다.

리터럴로 만든Map 객체

전체 맵은 중괄호로 묶여져 있고 중괄호 안에는 쉼표로 구분된 키와 값 쌍이 있습니다. 이러한 키와 값은 콜론으로 구분됩니다. Map의 최종 결과는 JSON과 매우 흡사합니다. 경우에 따라 맵을 성성한 후 특정 키에 값을 할당해야 하는 경우가 생기는데요.

Map<String, dynamic> user = Map<String, dynamic>();
user['firstName'] = this.firstName;

값을 할당하려면 대괄호 안에 넣고 할당 연산자를 사용하여 값을 할당하면 됩니다.

3. 마지막 단계로 JSON을 생성하는 단일 함수 jsonEncode()를 호출하면서 생성한 Map을 매개변수로 넣어주면 됩니다. jsonEncode 함수를 쓰기 위해서는 dart:convert 패키지를 import 해야 합니다. json으로 바뀌는 프로세스는 자동이므로 사실 반수동 직렬화에 더 가깝습니다.

 

이제 코드에서 살펴보도록 하겠습니다.


직렬화(Serialization) 실습

아래 Use클래스가 있습니다.

User라는 클래스는 4개의 프로퍼티를 가지고 있습니다. 두개의 String 타입과, 부울, int형이 존재하고 있군요! 이 프로퍼티들에 할당되는 데이터를 가져와서 JSON형식의 문자열로 만드는 것이 직렬화의 골입니다.

JSON을 생성하기 위해 User 클래스에 메소드를 추가 하겠습니다. 일반적으로 JSON형식을 리턴하는 역할을 하는 메소드명을 toJson으로 많이 만듭니다. 저도 toJson으로 만들겠습니다.

문자열을 반환하는 toJson 메소드를 추가하였습니다. 메소드 내부에서 Map을 생성하고 있는데요. 변수 이름을 userMap으로 만들어 주었습니다. 키는 문자열 타입이고 값은 dynamic 타입이므로 Map<String, dynamic>과 같이 선언해 줍니다. Map 생성은 리터럴을 사용하여 User 클래스의 각 속성에 대한 키, 값 쌍을 만들어 주었습니다. 수동 직렬화를 할때 키의 오타를 내지 않게 하는것이 매우 중요한 점입니다. 이제 jsonEncode 함수를 사용하기 위해 dart:convert패키지를 import 하고있습니다. jsonEncode를 호출하여 userMap을 전달하고 JSON 문자열을 리턴해 주고 메소드 처리가 끝이 납니다.

 

메서드를 실행해보고 콘솔에 JSON문자열을 출력해 보겠습니다.

mian 함수에서 user 객체를 생성한 후 toJson 메소드를 통해 JSON문자열을 얻을 수 있었고 출력이 잘 되는 걸 확인할 수 있었습니다. 맵에서 키를 작은따옴표를 사용했음에도 불구하고 생성된 JSON에서 모든 문자열은 큰따옴표로 묶였습니다. isActive 속성도 부울로 저장되고 age는 숫자로 저장됩니다.

 


여기까지 수고하셨습니다. Dart와 flutter의 수동 직렬화에 대해서 공부해 보았는데요. 다음 포스트에서 자동 직렬화에 대해 알아보도록 하겠습니다. 그럼 즐거운 코딩 하세요.

 

 

 

 

 

 

 

 

댓글