다재다능 개발자 성장기 🚀
Dart에서 JSON을 사용해보자 본문
우선 JSON에 대해서 알아보자 ☘️
생긴 모습
{
"name": "핑핑이",
"age": 3
}
JSON의 특징
- JavaScript Object Notion의 약자로서, JS의 객체 표기 방식을 기반으로 한다.
- 데이터를 저장하거나 전송할 때 사용되는 형식이다.
- 키-값의 형태로 되어있다.
- 키값은 반드시 String형식이어야 한다.
Dart의 Map과 JSON 모두 key - value 의 형태로 사용하는데, 그냥 Map을 사용하면 안될까?
=> NO! 보이는 형식이 동일하더라도, 실제로는 다른 용도와 특징을 가지고 있다.
=> Dart의 Map은 프로그램 언어 내에서 데이터를 관리하기 위한 데이터 구조이다. 즉 프로그램 내부에서만 사용되는 데이터 표현방식이다. 반면에 JSON 은 데이터 교환을 위해 설계된 텍스트 기반의 포맷이다.
=> Map을 데이터 전송하는데 사용할 수 없다. 마찬가지로 JSON 자체를 프로그램 언어 내에서 사용할 수 없다. 각자의 역할이 있는 것이다. print() 문을 사용해서 JSON 객체의 타입을 출력해보면 String 타입이라는 것을 확인 할 수 있다.
=> 생긴건 비슷하더라도 사용되는 용도는 완전 다르기 때문에! 인코딩과 디코딩 등으로 적재적소에 변환해서 사용해줘야 되는 것이다.
직렬화와 역직렬화
1) 직렬화
=> 객체나 데이터 구조를 일련의 바이트 또는 문자열로 변환하는 과정이다. 데이터를 저장하거나 전송하기 위해 필요하다.
Dart 객체 -> Map -> String(JSON)
인코딩
- 직렬화 안에 인코딩이 포함될 수 있다
- 특정 문자 집합을 다른 형식으로 변환하는 과정
=> Dart에서는 Dart의 객체를 Map을 거쳐 JSON 형식으로 변환하는 과정을 의미한다
void main() {
// Dart 객체 생성
final person = {'name': '홍길동', 'age': 30};
// JSON 문자열로 변환
final jsonString = jsonEncode(person);
print(jsonString); // 출력: {"name":"홍길동","age":30}
}
2) 역직렬화
=> 직렬화된 데이터를 가지 원래의 객체나 데이터 구조로 복원하는 작업이다.
String(JSON) -> Map -> Dart 객체
디코딩
- 역직렬화 안에 디코딩이 포함될 수 있다
- 인코딩된 데이터를 다시 원래의 문자 집합으로 변환하는 과정
=> Dart에서는 JSON 문자열을 Map을 거쳐 Dart 객체로 변환하는 과정을 의미한다
void main() {
// JSON 문자열
final jsonString = '{"name":"홍길동","age":30}';
// Dart 객체로 변환
final Map<String, dynamic> person = jsonDecode(jsonString);
print(person['name']); // 출력: 홍길동
}
fromJson 메서드
JSON 형식의 데이터를 Dart 객체로 변환하는 역할
class User {
final String name;
final int age;
User({required this.name, required this.age});
User.fromJson(Map<String, dynamic> json) : this(
name: json['name'],
age: json['age'],
);
}
void main() {
final jsonString = '{"name": "홍길동", "age": 30}';
final Map<String, dynamic> jsonMap = jsonDecode(jsonString);
final User user = User.fromJson(jsonMap);
print(user.name); // 출력: 홍길동
}
왜 사용하는가 ?
Dart에서는 관례적으로 decode하여 JSON을 Map 형태로 변경한 데이터를 fromJson이라는 생성자를 사용하여 Dart 객체로 한 번 더 변환하는 과정을 거쳐 프로그램에 사용하게 된다.
디코딩까지 했는데(번거롭게 또 변환하지 않고) 그냥 Map 형태로 사용하면 안될까? 라는 의문이 생겨 찾아보니 Map형식의 데이터를 프로그래밍에서 사용하게 되면, 키값으로 데이터를 찾을 때 오타로 인해 오류가 날 확률이 높아져 안정성이 떨어지기 때문에 fromJson같은 생성자를 만들어서 사용하는 방식이 일반적이라고 한다. 객체로 변환하면 객체.(콤마) 형식으로 프로퍼터를 찾아서 사용할 수 있기 때문에 여러모로 Map에 비해 훨씬 편리하고 안정적이다. 역시 다 이유가 있어서 만들어진 것이었다.
toJson 메서드
Dart 객체를 Map 형태로 변환하는 역할
class User {
final String name;
final int age;
User({required this.name, required this.age});
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
};
}
}
왜 사용하는가 ?
toJson 메서드 또한 Dart에서 JSON을 사용할 때 관례적으로 사용되는 메서드이다. toJson메서드를 사용하면 좋은 점은, 디버깅 하거나 콘솔에 객체를 출력해볼 때 내부 데이터를 모두 출력해볼 수 있어서 편리하다는 것이다.
print 메서드는 내부적으로 toString()을 사용하여 출력하게 되는데, toString()는 객체를 출력할 때 객체의 내용이 아닌 객체의 타입을 반환한다. 그렇기 때문에 객체 내부의 데이터를 출력할 때에는 toJson 메서드로 객체를 JSON 형식으로 변형해주면 개발 시 유용하다.
그리고 Dart 객체를 JSON으로 변환(인코드)하기 전에 데이터를 원하는 형태로 가공할 수 있다. 이게 뭐가 좋냐면 일단 필요한 데이터만 뽑아서 JSON 으로 만들 수 있어 사용하기 편리하고, JSON 구조를 직접 코딩하는 것보다 오타나 누락으로 인한 오류 발생 가능성을 줄일 수 있다.
'Flutter' 카테고리의 다른 글
24.12.3 TIL (0) | 2024.12.02 |
---|---|
오늘 배운 것 이것저것 정리 (0) | 2024.11.29 |
Unhandled Exception: Unable to load asset: "assets/images/cart.svg". (0) | 2024.11.25 |
Flutter로 기차 예매 서비스 만들기 회고(feat. 다크모드) (0) | 2024.11.20 |
Flutter 아이콘 한 눈에 찾기 쉬운 사이트 (0) | 2024.11.19 |