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

직렬화 (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 객체→Map→String: 구조 있는 데이터를 → 문자열로 바꾼다
- dart 객체 → JSON 문자열
역직렬화(decode)
- 그 표현을 다시 의미로 복원하는 것
String→Map→Dart 객체: 문자열을 → 구조 있는 데이터로 바꾼다.
Dart SDK의 dart: convert 라이브러리에 jsonEncode, jsonDecode 함수 ⇒
Map, List를 String 으로 변환해주거나 Map , List를 String 등으로 변환해줌.jsonEncode 사용법encode :
객체 → Stringimport '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이 될 수 있는Stringtype으로 합니다
{
"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