Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

다재다능 개발자 성장기 🚀

Dart에서 JSON을 사용해보자 본문

Flutter

Dart에서 JSON을 사용해보자

merrytang 2024. 11. 28. 22:44

우선 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 구조를 직접 코딩하는 것보다 오타나 누락으로 인한 오류 발생 가능성을 줄일 수 있다.