학습
Dart JSON 데이터 처리
Dart JSON 데이터 처리 — 중급
JSON 데이터 처리
1. 도입 (왜 배워야 하는가)
현대의 애플리케이션은 다양한 데이터 소스를 활용하여 동작합니다. 그 중에서도 JSON(JavaScript Object Notation)은 데이터 교환의 표준 포맷으로 자리잡았습니다. 특히, 웹 API와의 통신, 데이터 저장 및 전송에서 가장 널리 사용되는 형식입니다.
JSON을 처리하는 능력이 없다면, 외부 데이터와의 상호작용이 제한되거나, 데이터를 수동으로 처리해야 하는 번거로움이 생깁니다. 이는 개발 시간과 유지보수 비용을 증가시킬 수 있습니다. 예를 들어, 쇼핑몰 앱에서 사용자 장바구니 정보를 서버로부터 받아와야 할 때 JSON을 사용하지 않으면 서로 다른 형식의 데이터를 일일이 변환해야 할 수도 있습니다.
2. 핵심 개념 설명
- JSON 구조: JSON은 키-값 쌍으로 구성된 데이터 구조입니다. 이는 마치 일기장에 친구의 전화번호를 적어두는 것과 같습니다. 친구의 이름이 키, 전화번호가 값이 되는 것이죠.
- Serialization (직렬화): 데이터 구조를 JSON 형식으로 변환하는 과정을 말합니다. 이는 마치 책을 읽을 수 있는 형태로 변환하는 것과 유사합니다.
- Deserialization (역직렬화): JSON 형식의 데이터를 다시 객체 형태로 변환하는 과정입니다. 마치 사전에서 단어의 뜻을 찾아 다시 문장으로 만드는 것과 같습니다.
import 'dart:convert';: JSON 처리를 위한 라이브러리를 가져옵니다.String jsonString = '{"name": "Alice", "age": 30}';: JSON 형식의 문자열을 정의합니다.Map<String, dynamic> user = jsonDecode(jsonString);: JSON 문자열을 Dart 객체로 변환합니다.print('Name: ${user['name']}');: 변환된 객체에서 이름을 출력합니다.print('Age: ${user['age']}');: 변환된 객체에서 나이를 출력합니다.String jsonStringBack = jsonEncode(user);: Dart 객체를 다시 JSON 문자열로 변환합니다.print(jsonStringBack);: 변환된 JSON 문자열을 출력합니다.- JSON 문자열의 형식 오류:
- 타입 불일치:
- Null 처리 미비:
- JSON은 데이터 교환의 표준 포맷으로, 다양한 데이터 소스와의 상호작용에 필수적입니다.
- Serialization과 Deserialization은 JSON 처리를 위한 핵심 개념입니다.
- API 통신이나 데이터 저장 등 다양한 실무 상황에서 JSON을 활용할 수 있습니다.
- Dart에서 HTTP 요청 처리 및 API 통신 방법
- Flutter에서 JSON 데이터를 활용한 UI 업데이트
- 데이터베이스와의 연동 방법 (예: SQLite)
| 용어 | 설명 |
|---|---|
| JSON | JavaScript Object Notation, 데이터 구조의 포맷 |
| Serialization | 객체를 JSON으로 변환하는 과정 |
| Deserialization | JSON을 객체로 변환하는 과정 |
3. 기본 코드 예제
아래는 Dart에서 JSON을 처리하는 기본 예제입니다.
import 'dart:convert';
void main() {
// JSON 문자열
String jsonString = '{"name": "Alice", "age": 30}';
// JSON 문자열을 객체로 변환 (Deserialization)
Map<String, dynamic> user = jsonDecode(jsonString);
// 객체에서 데이터 접근
print('Name: ${user['name']}'); // Name: Alice
print('Age: ${user['age']}'); // Age: 30
// 객체를 JSON 문자열로 변환 (Serialization)
String jsonStringBack = jsonEncode(user);
print(jsonStringBack); // {"name":"Alice","age":30}
}
실행 결과:
Name: Alice
Age: 30
{"name":"Alice","age":30}
코드 한 줄씩 동작 설명:
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니에 상품 정보를 JSON 형식으로 저장하고 불러오는 예제입니다.
import 'dart:convert';
void main() {
// 장바구니 상품 리스트
List<Map<String, dynamic>> cartItems = [
{'id': 1, 'name': 'Apple', 'quantity': 2},
{'id': 2, 'name': 'Banana', 'quantity': 3},
];
// 장바구니를 JSON 문자열로 변환
String cartJson = jsonEncode(cartItems);
print(cartJson);
// JSON 문자열을 다시 리스트로 변환
List<dynamic> cartFromJson = jsonDecode(cartJson);
print(cartFromJson);
}
상황 설명: 사용자가 장바구니에 추가한 상품 정보를 JSON으로 변환하여 서버에 전송하거나 저장할 수 있습니다.
예제 2: API 데이터 요청
서버로부터 사용자 정보를 받아오는 예제입니다.
import 'dart:convert';
void main() {
// API로부터 받아온 JSON 데이터
String apiResponse = '{"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]}';
// JSON 데이터를 객체로 변환
Map<String, dynamic> data = jsonDecode(apiResponse);
List<dynamic> users = data['users'];
// 사용자 정보 출력
for (var user in users) {
print('User ID: ${user['id']}, Name: ${user['name']}');
}
}
상황 설명: 서버에서 받아온 사용자 정보를 JSON으로 변환하여 앱에서 사용할 수 있습니다.
5. 흔한 실수와 주의사항
- 잘못된 코드: String jsonString = '{name: "Alice", age: 30}';
- 올바른 코드: String jsonString = '{"name": "Alice", "age": 30}';
- 주의사항: JSON 키는 반드시 따옴표로 감싸야 합니다.
- 잘못된 코드: int age = user['age']; (만약 'age'가 String으로 되어있다면)
- 올바른 코드: int age = int.parse(user['age']);
- 주의사항: JSON에서 가져온 데이터의 타입을 항상 확인해야 합니다.
- 잘못된 코드: print(user['email']); (email이 없을 경우)
- 올바른 코드: print(user['email'] ?? '이메일 없음');
- 주의사항: 존재하지 않는 키를 호출하면 NullPointerException이 발생할 수 있습니다.
6. 정리
다음에 학습하면 좋은 주제: