Flutter

Json Serialize, Deserialize

Dean83 2023. 3. 20. 12:16

주로 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