주로 REST API 통신시, Json으로 결과값을 파싱 하거나, json 으로 변환하여 전달한다.
즉, json 으로 변경하는것은 필수 이다.
Serialize 는 클래스를 Json 으로 바꾸는것이고, Deserialize는 json을 class 로 변경하는것이다.
각각 수동, 자동으로 구현할 수 있다.
상황에 맞게 수동, 자동으로 구현하면 된다.
1. 기본 decode
- jsonDecode(문자열) 을 이용하면 map 방식의 데이터로 돌려받는다.
......
Map<String,dynamic> 변수명 = jsonDecode(json문자열);
변수명['json 문자열 내부의 맴버 변수'] 으로 접근
2. 클래스에 serialize, deserialize 코드 넣기
class 클래스명 {
final String id1;
final String id2;
클래스명(this.id1, this.id2);
클래스명.fromJson(Map<String,dynamic> json)
: id1 = json['id1'],
id2 = json['id2'];
Map<String,dynamic> toJson() => {
'id1' : id1,
'id2' : id2
};
}
.....
클래스명 변수명 = 클래스명.fromJson(json문자열)
String toJson = jsonEncode(클래스 변수명)
3. 자동 serialize, deserialize 사용
- 변환해야 할 항목이 크거나, 서브 클래스 변수를 변환해야 할때 쓰면 좋다.
- pubspec.yaml 에 의존성 추가
dependencies:
# 다른 의존성들
json_annotation: ^2.0.0
dev_dependencies:
# 다른 개발 의존성들
build_runner: ^1.0.0
json_serializable: ^2.0.0
- 클래스 구현
import 'package:json_annotation/json_annotation.dart';
/// 이 구문은 `User` 클래스가 생성된 파일의 private 멤버들을
/// 접근할 수 있도록 해줍니다. 여기에는 *.g.dart 형식이 들어갑니다.
/// * 에는 소스 파일의 이름이 들어갑니다.
part '클래스명.g.dart';
@JsonSerializable()
class 클래스명 {
클래스명(this.id1, this.id2,this.data1);
String id1;
//만일 json에서 키 이름을 바꾸고 싶다면, 아래코드를 쓴다
//이럴경우 id2 는 변경할 키 이름으로 바뀐다.
@JsonKey(name:'변경할 키 이름')
String id2;
다른클래스명 data1;
factory 클래스명.fromJson(Map<String,dynamic> json) => _$클래스명FromJson(json);
Map<String,dynamic> toJson() => _$클래스명ToJson(this);
}
.....
var 변수명 = 클래스명.fromJson(jsonDecode(json문자열))
String json = jsonEncode(변수명)
- part '클래스명.g.dart' 가 없다는 오류가 생길텐데, 해당 파일을 자동생성 해주어야 한다.
- flutter pub run build_runner build 를 루트에서 실행시 생성이 된다 (빌드시 생성)
- flutter pub run build_runner watch 를 루트에서 실행하여 지속적으로 갱신한다.
'Flutter' 카테고리의 다른 글
SafeArea 위젯, Expanded 위젯 (0) | 2023.03.24 |
---|---|
NavigationRail 및 LayoutBuilder 위젯 (0) | 2023.03.24 |
REST API 통신 (0) | 2023.03.20 |
Slivers, CustomScrollView (0) | 2023.03.14 |
Builder (StreamBuilder, FutureBuilder) (0) | 2023.03.14 |