Flutter Package : Json_serializable

mmmYoung·2023년 4월 17일
0

플러터

목록 보기
9/11

Json_serializable

서버에서 json형식의 데이터를 받아오면 반드시 데이터 형변환이 필요하다.
아래와 같이 필요한 멤버변수들을 추가한 모델 클래스를 만들었을때, 서버 데이터인 json을 모델에 맞게 바꿔주는 fromJson 메서드를 만들게 된다.
참고로 json은 항상 Map<String,dynamic> 형태!

기존 코드

class ExampleModel {
  final String id;
  final String name;
  final String thumbUrl;
  final List<String> tags;

  ExampleModel({
    required this.id,
    required this.name,
    required this.thumbUrl,
    required this.tags,
  });

factory ExampleModel.fromJson({
   required Map<String, dynamic> json,
 }) {
   return ExampleModel(
     id: json['id'],
     name: json['name'],
     thumbUrl: 'http://$ip${json['thumbUrl']}',
     tags: List<String>.from(json['tags']),
   );
 }

모든 모델 클래스를 만들때마다 이렇게 일일이 바꿔주기 번거울때 사용할 수 있는 것이 Json_serializable이다.

사용방법

  1. Readme에 있는 json_annotation, build_runner,json_serializable를 모두 추가한다.

  2. 해당 클래스가 있는 파일에 part 'filename.g.dart';를 추가하고, 클래스 위에 @JsonSerializable()를 추가한다.

  3. 터미널에서 flutter pub run build_runner build를 실행한다.

  4. g.dart 파일이 생성되면, fromJson 메서드를 직접 생성할 필요 없이 아래 코드만 만들어주면 된다.

  factory ExampleModel.fromJson(Map<String, dynamic> json) =>
      _$ExampleModelFromJson(json);
  1. 만약 fromJson에서, 임의로 변환한 다른 코드가 있거나, 멤버변수명이 가져오는 json의 키 값과 다르다면 클래스 JsonKey를 사용할 수 있다.

JsonKey

위의 예시 코드에서, thumbUrl을 받아온 뒤

thumbUrl: 'http://$ip${json['thumbUrl']}',

형태로 가공하는 것을 볼 수 있다.

이런식으로 가공을 하기 위해 우선 static으로 변환 함수인 pathToUrl를 만들어준다.

static pathToUrl(String val) => 'http://$ip$val';

여기서 val은 json['thumbUrl'] 을 의미한다.

해당 멤버 변수 바로 위에 @JsonKey(fromJson: pathToUrl)로 선언해주면 된다.

예를 들어 내가 만든 클래스의 멤버변수 이름이 thumbUrl이 아니라 image_url이라면, 아래와 같이 써주면 된다!

@JsonKey(name: 'thumbUrl')
final String image_url;

변경 코드


part 'example_model.g.dart';

@JsonSerializable()
class ExampleModel {
  final String id;
  final String name;
  @JsonKey(fromJson: pathToUrl)
  final String thumbUrl;
  final List<String> tags;

  ExampleModel({
    required this.id,
    required this.name,
    required this.thumbUrl,
    required this.tags,
    });

  static pathToUrl(String val) => 'http://$ip$val';
 
  factory ExampleModel.fromJson(Map<String, dynamic> json) =>
      _$ExampleModelFromJson(json);
      
      
profile
안냐세여

0개의 댓글