서버에서 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이다.
Readme에 있는 json_annotation, build_runner,json_serializable를 모두 추가한다.
해당 클래스가 있는 파일에 part 'filename.g.dart';를 추가하고, 클래스 위에 @JsonSerializable()를 추가한다.
터미널에서 flutter pub run build_runner build를 실행한다.
g.dart 파일이 생성되면, fromJson 메서드를 직접 생성할 필요 없이 아래 코드만 만들어주면 된다.
factory ExampleModel.fromJson(Map<String, dynamic> json) =>
_$ExampleModelFromJson(json);
위의 예시 코드에서, 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);