JSON, Serialization, Deserialization

하요·2024년 7월 2일
0
post-thumbnail

Dart에서 JSON 데이터 처리하기: 직렬화 & 역직렬화

Dart에서 JSON 데이터를 효과적으로 처리하기 위해서는 직렬화(Serialization)와 역직렬화(Deserialization) 개념을 이해하는 것이 중요합니다. JSON 포맷을 통해 데이터를 주고받을 때 이 과정을 통해 데이터를 쉽게 변환하고 사용할 수 있습니다.

주요 개념

  • 직렬화 (Serialization): Dart 객체를 문자열로 변환하는 과정입니다.
  • 역직렬화 (Deserialization): 문자열을 Dart 객체로 변환하는 과정입니다.

직렬화와 역직렬화를 사용하는 이유

  • 네트워크 전송: 데이터를 네트워크를 통해 전송할 때, 직렬화가 필요합니다.
  • 데이터 추출 용이성: 역직렬화를 통해 원하는 값을 쉽게 추출할 수 있습니다.
    • 문자열에서 값을 추출하기 어려운 경우
      String data = '{"name":"철수", "age":10}';
      String name = data.substring(9, 11);
      print(name); // "철수"
      
    • 데이터 자료형이 모두 String이므로 다른 타입의 내장 메소드를 사용할 수 없는 경우

주요 사용 사례

  • 네트워크 요청 및 응답: JSON 포맷을 사용하여 데이터를 주고받을 때 사용합니다.
  • 데이터 저장 및 로드: 파일이나 데이터베이스에서 데이터를 읽고 쓸 때 사용합니다.

주요 활용도

  • 네트워크 통신: JSON 형식으로 데이터를 주고받기 위해 직렬화와 역직렬화를 사용합니다.
  • 데이터 저장: JSON 형식으로 데이터를 저장하고 읽을 때 유용합니다.
  • 데이터 변환: 다양한 포맷의 데이터를 Dart 객체로 변환하거나 Dart 객체를 다양한 포맷으로 변환할 때 사용합니다.

코드 예제

직렬화 구현

import 'dart:convert';

class Person {
  final String name;
  final int age;

  const Person({
    required this.name,
    required this.age,
  });

  // Map<String, dynamic>을 JSON 포맷 문자열로 직렬화 (Serialization)
  Map<String, dynamic> toJson() {
    return {
      "name": name,
      "age": age,
    };
  }
}

void main() {
  // Person 인스턴스 생성
  Person person = Person(name: "철수", age: 10);

  // Person -> Map<String, dynamic>
  Map<String, dynamic> personMap = person.toJson();
  print(personMap);

  // Map<String, dynamic> -> JSON 포맷 String
  String personString = jsonEncode(personMap);
  print(personString);
}

역직렬화 구현

import 'dart:convert';

class Person {
  final String name;
  final int age;

  const Person({
    required this.name,
    required this.age,
  });

  // JSON 포맷 문자열을 Map<String, dynamic>으로 역직렬화 (Deserialization)
  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(
      name: json['name'],
      age: json['age'],
    );
  }
}

void main() {
  // 네트워크 응답 문자열
  String jsonString = '{"name": "철수", "age": 10}';

  // JSON 포맷 String -> Map<String, dynamic>
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  print(jsonMap);

  // Map<String, dynamic> -> Person
  Person person = Person.fromJson(jsonMap);
  print(person.name); // 철수
  print(person.age);  // 10
}

추가 팁

  • jsonEncode()와 jsonDecode() 사용: dart:convert 패키지의 jsonEncode()jsonDecode() 함수를 사용하여 JSON 데이터의 직렬화와 역직렬화를 간편하게 수행할 수 있습니다.
  • 직렬화 시 클래스의 toJson() 메서드 활용: 객체를 JSON으로 변환할 때 클래스에 toJson() 메서드를 정의하여 사용합니다.
  • 역직렬화 시 클래스의 fromJson() 메서드 활용: JSON 데이터를 객체로 변환할 때 클래스에 fromJson() 팩토리 생성자를 정의하여 사용합니다.

관련 자료

이렇게 JSON 포맷을 이용해 데이터를 직렬화 및 역직렬화함으로써 네트워크를 통해 데이터를 쉽게 주고받을 수 있습니다.

profile
flutter 개발자(진)

0개의 댓글