IMCAT.DEV
로그인 가입
Dart 중급 자료구조

Dart JSON 데이터 처리

Dart JSON 데이터 처리 — 중급

JSON 데이터 처리

1. 도입 (왜 배워야 하는가)

현대의 애플리케이션은 다양한 데이터 소스를 활용하여 동작합니다. 그 중에서도 JSON(JavaScript Object Notation)은 데이터 교환의 표준 포맷으로 자리잡았습니다. 특히, 웹 API와의 통신, 데이터 저장 및 전송에서 가장 널리 사용되는 형식입니다.

JSON을 처리하는 능력이 없다면, 외부 데이터와의 상호작용이 제한되거나, 데이터를 수동으로 처리해야 하는 번거로움이 생깁니다. 이는 개발 시간과 유지보수 비용을 증가시킬 수 있습니다. 예를 들어, 쇼핑몰 앱에서 사용자 장바구니 정보를 서버로부터 받아와야 할 때 JSON을 사용하지 않으면 서로 다른 형식의 데이터를 일일이 변환해야 할 수도 있습니다.

2. 핵심 개념 설명

  1. JSON 구조: JSON은 키-값 쌍으로 구성된 데이터 구조입니다. 이는 마치 일기장에 친구의 전화번호를 적어두는 것과 같습니다. 친구의 이름이 키, 전화번호가 값이 되는 것이죠.
  2. Serialization (직렬화): 데이터 구조를 JSON 형식으로 변환하는 과정을 말합니다. 이는 마치 책을 읽을 수 있는 형태로 변환하는 것과 유사합니다.
  3. Deserialization (역직렬화): JSON 형식의 데이터를 다시 객체 형태로 변환하는 과정입니다. 마치 사전에서 단어의 뜻을 찾아 다시 문장으로 만드는 것과 같습니다.
  4. 용어설명
    JSONJavaScript Object Notation, 데이터 구조의 포맷
    Serialization객체를 JSON으로 변환하는 과정
    DeserializationJSON을 객체로 변환하는 과정

    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}

    코드 한 줄씩 동작 설명:

  5. import 'dart:convert';: JSON 처리를 위한 라이브러리를 가져옵니다.
  6. String jsonString = '{"name": "Alice", "age": 30}';: JSON 형식의 문자열을 정의합니다.
  7. Map<String, dynamic> user = jsonDecode(jsonString);: JSON 문자열을 Dart 객체로 변환합니다.
  8. print('Name: ${user['name']}');: 변환된 객체에서 이름을 출력합니다.
  9. print('Age: ${user['age']}');: 변환된 객체에서 나이를 출력합니다.
  10. String jsonStringBack = jsonEncode(user);: Dart 객체를 다시 JSON 문자열로 변환합니다.
  11. print(jsonStringBack);: 변환된 JSON 문자열을 출력합니다.
  12. 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. 흔한 실수와 주의사항

  13. JSON 문자열의 형식 오류:
  14. - 잘못된 코드: String jsonString = '{name: "Alice", age: 30}'; - 올바른 코드: String jsonString = '{"name": "Alice", "age": 30}'; - 주의사항: JSON 키는 반드시 따옴표로 감싸야 합니다.

  15. 타입 불일치:
  16. - 잘못된 코드: int age = user['age']; (만약 'age'가 String으로 되어있다면) - 올바른 코드: int age = int.parse(user['age']); - 주의사항: JSON에서 가져온 데이터의 타입을 항상 확인해야 합니다.

  17. Null 처리 미비:
  18. - 잘못된 코드: print(user['email']); (email이 없을 경우) - 올바른 코드: print(user['email'] ?? '이메일 없음'); - 주의사항: 존재하지 않는 키를 호출하면 NullPointerException이 발생할 수 있습니다.

    6. 정리

    • JSON은 데이터 교환의 표준 포맷으로, 다양한 데이터 소스와의 상호작용에 필수적입니다.
    • Serialization과 Deserialization은 JSON 처리를 위한 핵심 개념입니다.
    • API 통신이나 데이터 저장 등 다양한 실무 상황에서 JSON을 활용할 수 있습니다.
    • 다음에 학습하면 좋은 주제:

    • Dart에서 HTTP 요청 처리 및 API 통신 방법
    • Flutter에서 JSON 데이터를 활용한 UI 업데이트
    • 데이터베이스와의 연동 방법 (예: SQLite)