Dev/Flutter

[Flutter] Json 데이터를 객체로 변환하는 방법

healthyryu 2024. 12. 3. 11:36
class Human {
  String name;
  int age;
  Human({required this.name, required this.age});


  factory Human.fromJson(Map<String, dynamic> json)
   : this(
    name: json['name'],
    age: json['age']
   );
}

 

fromJson() 는 JSON 데이터를 객체로 변환하기 위해 만들었습니다.

 

  • 일반적으로, API 호출이나 파일 읽기 등의 작업에서 데이터를 JSON 형식으로 받는 경우가 많습니다.
  • JSON 데이터는 Dart에서 Map<String, dynamic> 형태로 표현됩니다.
  • 하지만 JSON 데이터만으로는 객체지향 프로그래밍의 장점을 살리기 어렵습니다. 따라서, 이 데이터를 우리가 정의한 클래스 객체로 변환해야 할 필요가 있습니다.

 

fromJson() 메서드의 역할

(메서드 이름은 보통 이렇게 지음)

 

  • fromJson()은 JSON 데이터를 받아서 객체를 생성하는 팩토리 메서드 또는 생성자입니다.
  • JSON 데이터를 Map<String, dynamic> 형태로 받고, 이를 객체의 속성(name, age)에 매핑합니다.

Json

{
  "name": "지훈",
  "age": 30
}

 

Dart

Human human = Human.fromJson({"name": "지훈", "age": 30});
print(human.name); // 지훈
print(human.age);  // 30

 

 

직렬화 그리고 역직렬화

위의 fromJson()역직렬화(Deserialization)의 일환으로, JSON 데이터를 객체로 변환합니다. 반대로 객체를 JSON으로 변환하는 직렬화(Serialization)toJson() 메서드를 사용해 구현할 수 있습니다.

 

class Human {
  String name;
  int age;
  
  Human({required this.name, required this.age});

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

 

해당 Json 데이터를 직렬화, 역직렬화 구현을 전부 할 필요없이 라이브러리를 활용한다면 훨씬 더 쉽게 코드를 작성할 수 있습니다.

 

json_serializable

json_serializable 패키지를 사용해서 아래와 같이 자동으로 생성할 수 있습니다.

 

pubspec.yaml

dependencies:
  json_annotation: ^4.8.0

dev_dependencies:
  build_runner: ^2.3.3
  json_serializable: ^6.7.0

 

Dart

import 'package:json_annotation/json_annotation.dart';

part 'human.g.dart'; // 자동 생성 파일

@JsonSerializable()
class Human {
  String name;
  int age;

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

  // JSON 데이터를 객체로 변환
  factory Human.fromJson(Map<String, dynamic> json) => _$HumanFromJson(json);

  // 객체를 JSON 데이터로 변환
  Map<String, dynamic> toJson() => _$HumanToJson(this);
}

 

pubspec.yaml 파일에 패키지를 추가하고 Dart 파일에 위와 같이 작성을 해주고 터미널에 아래의 명령어를 입력해주면 자동으로 파일이 생성이 됩니다.

 

Terminal

flutter pub run build_runner build

 

 


 

추가적으로 fromJson(), toJson() 의 함수가 클래스 안에서 만들어져야 하는 이유 4가지

1. 객체 지향 설계의 목적에 맞게 책임 분리 원칙을 따르게 하기 위해서

2. 캡슐화와 코드 재사용성이 용이하기 때문에

3. 읽기 쉽고 직관적이기 때문에

4. 유지보수가 용이하고 확장성이 높다

반응형