본문 바로가기
Dart, Flutter for App

Dart - 직렬화 json_serializable

by Oliver J 2024. 2. 7.
반응형

Dart 언어에서는 직렬화를 위해 json_serializable 패키지를 사용할 수 있다고는 하지만, plugin의 Marketplace 에서 Dart Data Class 라는 것을 설치하게 되면 아래와 같이 toJson()/fromJson() 을 쉽게 활용 할 수 있습니다.

 

조금 황당한 점은 위의 설명에는 함수명이 toJson()/fromJson() 이지만, 실제로 설치하면 아래와 같이 toMap()/fromMap() 으로 나옵니다. (기능은 동일합니다.)

class Employee {
  String name;
  int age;

  Employee({
    required this.name,
    required this.age,
  });

  Map<String, dynamic> toJson() {
    return {
      'name': this.name,
      'age': this.age,
    };
  }

  factory Employee.fromJson(Map<String, dynamic> map) {
    return Employee(
      name: map['name'] as String,
      age: map['age'] as int,
    );
  }

위의 코드는 toMap()과 fromMap()을 자동 생성한 코드로서 함수명만 toJson()과 fromJson()으로 변경해 주었습니다. 이렇게 Dart 언어에서는 간단하게 클래스를 직렬화가 가능하도록 만들 수 있으며, 아래의 코드는 Department객체를 직렬화하는 코드 입니다.

 

반응형
final employee = Employee(name: '홍길동', age: 41);
final department = Department(name: '총무부', leader: employee);
department.toJson()

하지만 toJson() 함수를 사용하여 직렬화를 하더라도, 실제 파일로 저장할 때에는 JsonEncode를 사용하여야 정확히 Json 타입으로 변경이 됩니다.

File('department.txt').writeAsStringSync(jsonEncode(department.toJson()));

위의 코드는 department.txt 파일에 Department 객체 직렬화하여 저장하는 코드입니다.

print(File('department.txt').readAsStringSync());

결과 : {"name":"총무부","leader":{"name":"홍길동","age":41}}

그리고 위와 같이 파일로부터 단순히 읽어오면, json 형식으로 불러오기에 Dart 언어 내부에서 데이터로서 활용하기 위해서는 jsonDecode를 해 주어야 합니다.

print(jsonDecode(File('department.txt').readAsStringSync()));

결과 : {name: 총무부, leader: {name: 홍길동, age: 41}}

이와 같이 Dart에서 직렬화를 plugin설치하여 사용함으로써, 데이터를 쉽고 효율적으로 처리할 수 있습니다.

728x90
반응형