본문 바로가기

모바일프로그래밍

다트로 데이터 다루기

다트로 데이터 다루기 - 서버에서 가져온 JSON 데이터 처리하기

서버에서 데이터를 주고받을 때 JSON(JavaScript Object Notation) 형식이 주로 사용된다.

다트에서는 dart:convert 패키지를 사용하여 JSON 데이터를 손쉽게 파싱하고 처리할 수 있다.

 

//다트언어
import 'dart:convert';

void main() {
  var jsonString = '''
  [
    {"score": 40},
    {"score": 80}
  ]
  ''';

  var scores = jsonDecode(jsonString);

  print(scores is List); // true 출력
  var firstScore = scores[0];

  print(firstScore is Map); // true 출력
  print(firstScore['score'] == 40); // true 출력
}

 

* 위 코드 설명 

 

dart: convert  패키지는 JSON 데이터를 디코딩(문자열 → 객체)하거나 인코딩(객체 → 문자열)하는 데 사용된다. 이 코드에서는 JSON 문자열을 디코딩하기 위해 사용됨

 

  • void main(): Dart 애플리케이션의 진입점으로 . main 함수 안에서 모든 실행이 시작된다.
  • var jsonString: JSON 형식의 문자열을 정의한 변수 이 문자열은 JSON 배열을 포함하고 있으며, 각 배열 요소는 score라는 키를 가진 객체(Map)
  • jsonDecode(jsonString): dart:convert에서 제공하는 함수로, JSON 형식의 문자열을 Dart 객체로 변환(디코딩)한다. JSON 배열은 Dart의 List로, JSON 객체는 Map으로 변환된다. 여기서 jsonString을 디코딩하여 scores 변수에 저장하게 된다. 결과적으로 scores는 List<Map<String, int>> 타입이다.
  • scores is List: scores 변수가 List 타입인지 확인하는 구문,  jsonDecode가 JSON 배열을 디코딩하면 List로 변환되기 때문에, true가 출력됨
  • scores[0]: 디코딩된 JSON 배열의 첫 번째 요소에 접근,  scores[0]은 {"score": 40}인 Map 객체이다. firstScore는 첫 번째 요소인 Map<String, int> 타입
  • firstScore is Map: firstScore가 Map 타입인지 확인하는 구문으로 첫 번째 요소가 객체이므로 Map 타입이며, 이 구문은 true를 출력
  • firstScore['score']: firstScore Map 객체에서 score 키에 해당하는 값을 가져오는 구문, 이 값은 40
  • == 40: firstScore['score']가 40과 같은지 비교 결과적으로 true가 출력됨

 

전체적인 흐름

  1. JSON 문자열을 정의하고, 이 문자열을  jsonDecode 로 디코딩하여 List 타입으로 변환
  2. 첫 번째 요소(scores[0])는 Map 객체로 변환되어 firstScore 변수에 저장됨
  3. Map 객체가 Map 타입인지 확인하고, score 키의 값이 40과 같은지 비교
  4. 모든 과정에서 true 값이 출력되며, JSON 데이터를 성공적으로 디코딩하고, 적절한 값에 접근하여 비교가 이루어짐

 

스트림 통신

스트림(Stream)은 데이터의 비동기적인 연속된 흐름을 처리하는 방식이다. 스트림은 단일 이벤트가 아니라 여러 이벤트가 순차적으로 발생하는 상황에 유용하다. 예를 들어, 웹 소켓 통신이나 실시간 데이터 피드에서 스트림이 사용된다.

스트림에는 두 가지 종류가 있다.

  • 단일 구독 스트림: 하나의 리스너만 데이터에 접근할 수 있습니다.
  • 브로드캐스트 스트림: 여러 리스너가 데이터 흐름을 구독할 수 있습니다.

아래에 코드는 스트림(Stream)**을 생성하고, 그 스트림에서 데이터를 비동기적으로 처리한 후, 스트림의 모든 값을 더한 결과를 출력하는 코드로 async와 await를 사용하여 비동기 작업을 처리하고 있다.

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (var value in stream) {
    print('sumStream : $value');
    sum += value;
  }
  return sum;
}
Stream<int> countStream(int to) async* {
  for (int i = 1; i <= to; i++) {
    print('countStream : $i');
    yield i;
  }
}
main() async {
  var stream = countStream(10);
  var sum = await sumStream(stream);
  print(sum); // 55
}

 

 

1. sumStream 함수 (비동기적으로 스트림의 값을 합산)

  • 역할: 스트림의 모든 값을 읽고 그 값들을 합산한 후 반환하는 비동기 함수
  • await for (var value in stream): 비동기적으로 스트림에서 값을 하나씩 가져온다. 스트림에서 값이 올 때까지 기다린 후, 값을 받으면 value에 저장
  • 합산: 스트림에서 받은 value 값을 sum에 계속 더해 나간다.
  • 리턴: 모든 스트림 값의 합을 리턴

  • 2. countStream 함수 (1부터 to까지 숫자를 스트림으로 제공)
    • 역할: 1부터 to까지의 값을 스트림으로 생성하는 비동기함수
    • async*: 스트림 데이터를 생성할 때 사용하는 키워드 yield는 데이터를 하나씩 스트림에 전달하는 역할
    • for 반복문: 1부터 to까지 숫자를 반복하며 스트림에 전달 여기서는 to가 10이므로 1부터 10까지의 숫자를 스트림에 넣는다.
    3. main 함수 (프로그램의 시작점)
    • 역할: countStream을 호출하여 1부터 10까지 값을 제공하는 스트림을 생성하고, 그 스트림을 sumStream에 전달하여 모든 값을 합산한 후, 그 결과를 출력
    • await: sumStream이 비동기 함수이므로, 그 결과가 나올 때까지 기다린다. 합산 결과는 55입니다.
    출력 내용:
    • countStream의 출력: 스트림에서 1부터 10까지의 값을 하나씩 생성하여 출력
    • sumStream의 출력: 스트림에서 받은 각 값을 출력하고, 최종적으로 합산된 값(55)을 출력
    실행 흐름:
    1. countStream 함수가 실행되어 1부터 10까지의 값이 차례로 스트림에 전달됨
    2. sumStream 함수가 스트림에서 값을 하나씩 받아서 출력하고, 그 값을 합산한다.
    3. 모든 값을 더한 결과인 55가 출력된다.
  •  
  •  

'모바일프로그래밍' 카테고리의 다른 글

다트언어에서의 간단한 문제풀기  (1) 2024.10.06
다트언어  (0) 2024.10.06
다트언어  (0) 2024.09.30
안드로이드 스튜디오 설치하기  (0) 2024.09.16
플러터  (1) 2024.09.16