[Do it! 플러터] JSON 써보기

Heeyoung Joe·2023년 11월 4일
0

Flutter

목록 보기
2/7

일단 dart 공부하는 챕터까지는
dartpad.dev/? 를 써보려고 한다.

1. JSON Decode 예시 그대로 따라하기

import 'dart:convert';

void main() {
 var jsonString = '''
   [
     {"score":40},
     {"score":80},
   ]
   ''';
 var scores = jsonDecode(jsonString);
 print(scores is List);
 var firstScore = scores[0];
 print(firstScore is Map);
 print(firstScore['score'] == 40);
 
}

이렇게 써봤는데... 난 다 똑같이 썼다고 생각했는데 뭐가 틀렸는지 아래와 같은 에러가 떴다.

그치그치, 장고에서 JSON 쓸 때 대괄호 썼던 것 같아 싶어서 이렇게 바꿔봤는데

  var jsonString = '''
    {
      {"score":40},
      {"score":80},
    }

상관 없었다.

후후 발견했다. 아래처럼 쓰면 된다.

  var jsonString = '''
    [
      {"score":40},
      {"score":80}
    ]

{"score":80} 뒤의 쉼표가 문제였음...

2. JSON Encode 예시 그대로 따라하기

아래 코드가 원래 true가 나와야한다는데, 나는 false가 나왔다.

import 'dart:convert';

void main() {
  var jsonString = [
    {"score":40}, 
    {"score":80},
    {"score": 100, "overtime": true, "special_guest": null}
  ];
  var jsonText = jsonEncode(jsonString);
  print(jsonText == 
    '[{"score":40}, {"score":80},'
    '{"score": 100, "overtime": true,'
    '"special_guest": null}]');
}

항상 json 형식에서는 속성 이름을 작은 따옴표 안에, string 형식에서는 속성 이름을 큰 따옴표 안에 넣으시길래 따라해봤는데 그게 문제도 아니었다.

세상에 띄어쓰기 문제였다.

콜론과 세미콜론 전후 띄어쓰기를 몽땅 없애니 해결!

신기하다고 생각한 점

  • 굉장히 C랑 비슷한데 의외로 ' " 구분은 안하고,
  • 또 여러 줄의 string을 매 줄마다 따옴표를 붙이고 그 사이에 쉼표도 뭣도 넣지 않는 식으로 표기할 수 있다는 점?!!

3. Stream 통신

Stream과 yield 함께 쓰기

async 배우는 챕터에서 배운 거에 stream을 씌운 느낌이라
1. Stream<int> 반환형을 가진 함수
2. Stream<int>을 입력 받고 Future<int>를 반환하는 함수
3. Future<int>을 반환하는 함수의 결과를 await으로 받는 main 함수

이렇게 있었는데 처음 보는게 있었다.

Stream<int> countStream(int to) async* {
  for (int i = 1; i <= to; i++) {
    print("countStream: $i");
    yield i;
  }
}

async에 *가 붙는 것!
책에 의하면 비동기적으로 yield를 통해 지속적으로 데이터를 전달할 경우 쓰이는 명령어라고 한다.

또 하나는 await이 함수 호출문이 아니라 for문 앞에 붙는 형식

  await for (var value in stream) {
    print('sumStream : $value');
    sum += value;
  }

stream이 비동기적으로 데이터를 전송해주고 있기 때문에 붙는 것 같다.

.then() 쓰기

main() {
  var stream = Stream.fromIterable([1,2,3,4,5]);
  
  stream.first.then((value) => print('first: $value'));
}

이것 외에도 last, isEmpty, length 함수 뒤에 then 함수를 붙여쓸 수 있다.

profile
SW Engineer

0개의 댓글