데이터 통신 기초와 JSON (계속)

Eungae's avatar
Jan 08, 2026
데이터 통신 기초와 JSON (계속)

직렬화 (Serialization)

  • 객체를 서버에 전송하거나 로컬 저장소에 저장하기 위해 적합한 방식으로 변환하는 과정
  • 서로 다른 언어를 사용하는 플랫폼에서도 데이터를 주고받을 수 있게 하기 위해 JSON 형식을 주로 사용함.
 
JSON이란
  • Java Script Object Notation
  • = 데이터 표현 규칙
 
사용법
중괄호 안에 key - value
{ "name": "박정민", "age": 38 }
  • key 는 반드시 문자열
  • value 에 들어갈 수 있는 타입
    • String
    • Number (int, double)
    • Boolean (bool)
    • Array (대괄호)
    • Object (중괄호)
    • null
예) 강아지 정보를 JSON 형태로 표현
{ "name": "몽이", // String "age": 14, // int "isMale": false, // bool "favorite_foods": ["연어","사과","생닭"], // Array "dislike_foods": [], // Array "contact": { "mobile": "010-0000-0000", "email": null } // object }
 
 

Dart에서의 사용법

 
Dart에서 JSON 데이터 변환 방식
  • 데이터를 주고받을 때 JSON 형식의 String 으로 주고받음.
 
직렬화(encode)
  • 의미를 규칙에 맞게 표현으로 바꾸는 것
  • Dart 객체MapString : 구조 있는 데이터를 → 문자열로 바꾼다
  • dart 객체 → JSON 문자열
 
역직렬화(decode)
  • 그 표현을 다시 의미로 복원하는 것
  • StringMapDart 객체 : 문자열을 → 구조 있는 데이터로 바꾼다.
 
💡
Dart SDKdart: convert 라이브러리에 jsonEncode, jsonDecode 함수
Map, ListString 으로 변환해주거나 Map , ListString 등으로 변환해줌.
 
jsonEncode 사용법
encode : 객체String
import 'dart:convert'; void main() { Map<String, dynamic> myInfo = { "name": "박정민", "age": 37 }; // Map -> String String jsonString = jsonEncode(myInfo); print(jsonString); // {"name": "박정민", "age": 37} List list = [myInfo, myInfo]; String listJsonString = jsonEncode(list); print(listJsonString); // [{"name": "박정민", "age": 37}, {"name": "박정민", "age": 37}] }
 
jsonDecode 사용법
import 'dart:convert'; void main() { String jsonString = ''' { "name": "박정민", "age": 37 } '''; var result = jsonDecode(jsonString); // String -> Map print(result); // {name: 박정민, age: 37} print(result.runtimeType); // _Map<String, dynamic>
import 'dart:convert'; void main() { String jsonString = ''' [ { "name": "박정민", "age": 37 }, { "name": "구교환", "age": 43 } ] '''; var result = jsonDecode(jsonString); print(result); // [{name: 박정민, age: 37}, {name: 구교환, age: 43}] print(result.runtimeType); // List<dynamic> }
 
User class 만들기
import 'dart:convert'; void main() { String jsonString = """ { "name": "박정민", "age": 37 } """; var jsonMap = jsonDecode(jsonString); User user = User.fromJson(jsonMap); print(user.toJson()); // {name: 박정민, age: 37} } class User { User({required this.name, required this.age}); String name; int age; User.fromJson(Map<String, dynamic> map) : this(name: map['name'], age: map['age']); Map<String, dynamic> toJson() { return {"name": name, "age": age}; } }
 
 

실습

easy
혼잣말
뭔가, 왠지 모르겠는데, 머리에 들어오지 않아서, 이 코드를 10번 정도 반복해서 짰다.
나는 뭘 어디서부터 놓치고 있길래 이게 머리에 들어오지 않는 걸까.
{ "name": "오상구", "age": 7, "isMale" : true }
import 'dart:convert'; void main() { String jsonString = """ { "name": "오상구", "age": 7, "isMale" : true } """; // 1. Map<String, dynamic>으로 변환해서 map이라는 이름의 변수에 담기 // 3. jsonString 을 Map 으로 변환 후 Pet class로 변환 후 출력해서 변수에 담기! // 4. print 문으로 Pet 클래스의 toJson 메서드를 호출해서 출력 } /* * 2. 아래에서 클래스 정의 Pet * (함수 내에서는 클래스를 정의할 수 없습니다!) */
결과물
import 'dart:convert'; void main() { String jsonString = """ { "name": "오상구", "age": 7, "isMale": true } """; Map<String, dynamic> map = jsonDecode(jsonString); Pet pet = Pet.fromJson(map); print(pet.toJson()); } class Pet { Pet({required this.name, required this.age, required this.isMale}); String name; int age; bool isMale; Pet.fromJson(Map<String, dynamic> map) : this(name: map['name'], age: map['age'], isMale: map['isMale']); Map<String, dynamic> toJson() { return {"name": name, "age": age, "isMale": isMale}; } }
 
hard
아래의 JSON 문자열들을 객체화 하기위해 class를 만들어보고 역직렬화(String 타입의 JSON 을 class 로 변환) 해 봅시다
  • 최상위 JSON을 담을 클래스의 이름은 Pet, contect를 담을 클래스의 이름은 Contact로 합니다
  • contact 의 email은 null이 될 수 있는 String type으로 합니다
{ "name": "오상구", "age": 7, "isMale" : true, "favorite_foods" : ["삼겹살", "연어", "고구마"], "contact": { "mobile": "010-0000-0000", "email": null } }
import 'dart:convert'; void main() { String jsonString = """ { "name": "오상구", "age": 7, "isMale" : true, "favorite_foods" : ["삼겹살", "연어", "고구마"], "contact": { "mobile": "010-0000-0000", "email": null } } """; // 1. Map<String, dynamic>으로 변환해서 map이라는 이름의 변수에 담기 // 3. jsonString 을 Map 으로 변환 후 Pet class로 변환 후 출력해서 변수에 담기! // 4. print 문으로 Pet 클래스의 toJson 메서드를 호출해서 출력 } /* * 2. 아래에서 클래스 정의 Contact, Pet * (함수 내에서는 클래스를 정의할 수 없습니다!) */
결과물
import 'dart:convert'; void main() { String stringJson = """ { "name": "오상구", "age": 7, "isMale" : true, "favorite_foods" : ["삼겹살", "연어", "고구마"], "contact": { "mobile": "010-0000-0000", "email": null } } """; Map<String, dynamic> map = jsonDecode(stringJson); Pet pet = Pet.fromJson(map); print(pet.toJson()); } class Pet { String name; int age; bool isMale; List<String> favoriteFood; Contact contact; Pet({ required this.name, required this.age, required this.isMale, required this.favoriteFood, required this.contact, }); Pet.fromJson(Map<String, dynamic> json) : this( name: json["name"], age: json["age"], isMale: json["isMale"], favoriteFood: List<String>.from(json["favorite_foods"]), contact: Contact.fromJson(json["contact"]), ); Map<String, dynamic> toJson() { return { "name": name, "age": age, "isMale": isMale, "favorite_foods": favoriteFood, "contact": contact.toJson(), }; } } class Contact { String mobile; String? email; Contact({required this.mobile, required this.email}); Contact.fromJson(Map<String, dynamic> contact) : this(mobile: contact["mobile"], email: contact["email"]); Map<String, dynamic> toJson() { return {"mobile": mobile, "email": email}; } }
Share article

나새끼메이커