Dev/Flutter

[Flutter] Json Serializable 사용하기(Json 직렬화)

RaCoCeTTe 2024. 7. 9. 10:20

프로젝트를 할때마다 매번 서버에서 받아오는 데이터를 클래스로 처리할때마다

Json 직렬화를 일일히 작성해야하는 번거로움이 많았고

오타 하나로 데이터를 받지 못해 에러가 나는 상황도 종종 있었는데

 

Json Serializable 패키지를 사용하면

 

실수 및 번거로움을 해결해  작업 속도 향상에 도움을 줍니다.

 

https://pub.dev/packages/json_serializable

 

json_serializable | Dart package

Automatically generate code for converting to and from JSON by annotating Dart classes.

pub.dev

 

설치하기


flutter pub add json_annotation dev:build_runner dev:json_serializable


작업 중인 프로젝트 폴더에서 쉘에서 해당 명령어 실행

 

 

 

1. 직렬화할 클래스 생성

 - 기존 Json 직렬화 클래스

 

2. 직렬화 패키지 적용

 

- part '[파일명].g.dart' 를 추가하기

- 클래스 위에 @JsonSerializable() 어노테이션 추가

 

사진과 같이 존재하지 않는 파일 및 메서드로 에러가 발생하는게 정상입니다. 

생성한 적이 없기 떄문에

 

 

- 프롬프트에 밑에 해당하는 명령어 입력

 

dart run build_runner build

 

 

위와 같이 뜨면 성공입니다.

이제 같은 폴더에 member.a.dart 파일이 생성되었습니다.

 

part of 'member.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Member _$MemberFromJson(Map<String, dynamic> json) => Member(
      id: (json['id'] as num).toInt(),
      userId: json['userId'] as String,
      password: json['password'] as String,
      name: json['name'] as String,
      part: json['part'] as String,
      email: json['email'] as String,
      mobile: json['mobile'] as String,
    );

Map<String, dynamic> _$MemberToJson(Member instance) => <String, dynamic>{
      'id': instance.id,
      'userId': instance.userId,
      'password': instance.password,
      'name': instance.name,
      'part': instance.part,
      'email': instance.email,
      'mobile': instance.mobile,
    };

 

3. 직렬화 패키지 사용

- fromJson  toJson 메서드를 해당 코드와 같이 추가

 factory [클래스명].fromJson(Map<String, dynamic> json) => _$[클래스명]FromJson(json);

  Map<String, dynamic> toJson() => _$[클래스명]ToJson(this);

 

 

클래스안에 만약 또 다른 클래스가 있다면

@JsonSerializable()  파라미터에

explicitToJson : true  로 주게 되면 안에 다른 클래스가 있음을 파악합니다

@JsonSerializable(explicitToJson: true)

 

 

 

이렇게 하면 끝입니다.

 

Json Serializable에서 지원하는 변수는

일반 타입 변수 BigInt, bool, DateTime, double, Duration, Enum, int, Iterable, List, Map, num, Object, Record, Set, String, Uri
콜렉션 타입 변수 Iterable, List, Map, Record, Set 

 

또한 Map의 경우 키값이 BigInt, DateTime, Enum, int, Object, String, Uri 이 타입 중 하나여야 한다고 합니다.

 

만약 지원하지 않는 변수가 있을 경우에는 커스텀을 할 수 있는데 아직 쓸일이 없어서..