🐦 Flutter

[Flutter] 자동 생성 JSON 직렬화 코드와 비교

ji-hyun 2022. 8. 20. 15:17

모델 클래스에서 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);
}