모델 클래스에서 JSON 직렬화
User Class 모델을 사용해보겠습니다.
User Class 모델에는
- map 구조에서 새로운 User 객체를 생성하기 위한 생성자인 User.fromJson() 생성자
- User 객체를 map 구조로 변환하기 위한 메서드인 toJson() 메서드
class User {
final String name;
final String email;
User(this.name, this.email);
User.fromJson(Map<String, dynamic> json)
: name = json['name'],
email = json['email'];
Map<String, dynamic> toJson() =>
{
'name': name,
'email': email,
};
}
코드 생성 라이브러리를 통한 JSON 직렬화
여러 다른 라이브러리들이 있으나, 이 가이드에서는 JSON 직렬화 보일러 플레이트 코드를 생성해주는 소스 코드 자동 생성기인, json_serializable 패키지를 사용하겠습니다.
직렬화 코드가 더는 손수 작성되지 않고, 수동적으로 관리되지 않기에, 런타임 때 JSON 직렬화 오류의 위험을 최소화할 수 있습니다.
import 'package:json_annotation/json_annotation.dart';
/// 이 구문은 `User` 클래스가 생성된 파일의 private 멤버들을
/// 접근할 수 있도록 해줍니다. 여기에는 *.g.dart 형식이 들어갑니다.
/// * 에는 소스 파일의 이름이 들어갑니다.
part 'user.g.dart';
/// 코드 생성기에 이 클래스가 JSON 직렬화 로직이 만들어져야 한다고 알려주는 어노테이션입니다.
@JsonSerializable()
class User {
User(this.name, this.email);
String name;
String email;
/// map에서 새로운 User 인스턴스를 생성하기 위해 필요한 팩토리 생성자입니다.
/// 생성된 `_$UserFromJson()` 생성자에게 map을 전달해줍니다.
/// 생성자의 이름은 클래스의 이름을 따릅니다. 본 예제의 경우 User를 따릅니다.
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
/// `toJson`은 클래스가 JSON 인코딩의 지원을 선언하는 규칙입니다.
/// 이의 구현은 생성된 private 헬퍼 메서드 `_$UserToJson`을 단순히 호출합니다.
Map<String, dynamic> toJson() => _$UserToJson(this);
}
'🐦 Flutter' 카테고리의 다른 글
[Flutter] Statusbar color 화면마다 다르게 적용 (0) | 2022.09.26 |
---|---|
[Flutter] part 와 import 차이를 알아보자 (0) | 2022.08.20 |
Dart Named Constructor (0) | 2022.08.12 |
Flutter 생명주기 (0) | 2022.07.05 |
[Flutter] json 파싱 정보글 모음 (0) | 2022.06.24 |