서버에서 데이터를 가져올 때
보통 Json으로 가져오게 되는데
Map형태와 매우 유사하다
그래서 가져온 데이터를 우리는 Class로 변환할 줄 알아야한다!!!!!!
기본 중에 기본이라우
List<Map<String, String>> idol = [
{'name': '민지', 'group': '뉴진스'},
{'name': '혜린', 'group': '뉴진스'},
{'name': 'RM', 'group': 'BTS'},
{'name': '뷔', 'group': 'BTS'},
{'name': '하니', 'group': '뉴진스'},
];
위와 같은 데이터를 가져왔다고 치자..
이 Map데이터를 Class로 변환해보자
근데 왜 변환하는가?????????????????????????????????????
Map은 key value로 이루어진 각각의 item이 구조화가 돼있지 않기 때문에
자유도가 너무 높다, 신뢰도가 너무 낮다
그래서 신뢰도를 높이기 위해
Class안에 정의를 해야되고 Class로 정의내려졌을 때
기능을 할 수 있는 상태가 된다.
class Person {
final String name;
final String group;
Person({
required this.name,
required this.group
});
}
Person Class를 만들었다 이제 이 안에 정의를 하면 된다.
map을 통해 데이터를 가공하자
1. 넘어온 List,Map 데이터를 map을 통해 Person Class로 return 할 것이다.
final parsedIdol = idol.map((x)=>Person())
2. Class의 파라미터에 받아온 Map의 Key값을 할당 (Map을 Class의 파라미터로 할당)
final parsedIdol = idol.map((x)=>Person(
name: x['name'],
group: x['group']
));
3. Map의 값이 확실하게 있는 것을 알았으니 !를 통해 옵셔널을 풀어주자 (그 이후 List로 값을 일단 도출해보자)
final parsedIdol = idol.map((x)=>Person(
name: x['name']!,
group: x['group']!
)).toList();
print(parsedIdol);
이렇게 나오는 이유는 Class의 기본값이 Instance of 'Classname' 이기 때문이다.
이것을 이제 풀어야되는데 푸는 방법은 @override 이다.
4. Class에는 toString이라는 기본 함수가 있는데 이것을 재정의 해줘야 한다.
변경 이후에 값을 출력해보면
class Person {
final String name;
final String group;
Person({required this.name, required this.group});
@override
String toString(){
return 'Person(name: $name, group: $group)';
}
}
Map데이터가 Person Class로 알맞게 들어간 것을 볼 수 있다.
이제 Map데이터가 Class데이터로 신뢰할 수 있는 데이터가 됐으니 기능을 수행할 수 있게 됐다.
parsedIdol 객체를 사용하여 데이터를 가공하면 된다.
1. for in loop로 이름과 그룹을 한번 알아보자
for(Person person in parsedIdol) {
print(person.name);
print(person.group);
}
person에 .을 찍으면 Person에 들어가있는 파라미터를 그대로 사용할 수 있음을 알 수 있다.
코드가 아주 잘 출력 됐음을 알 수 있다.
2. where로 필터링을 해보자
final bts = parsedIdol.where(
(x) => x.group == '뉴진스');
print(bts);
parsedIdol이 Person의 Class로 갖춰져있기 때문에 where에 붙어 loop를 탈 x도 Person Class의 파라미터를 사용할 수 있다.
위 코드를 실행해 보면
필터링이 잘 됐음을 알 수 있다.
3. 코드를 간략하게 하기 위해 Map -> Class로 mapping을 해줌과 동시에 필터링을 걸 수 있다.
final result = idol.map(
(x) => Person(
name: x['name']!,
group: x['group']!
)).where((x) => x.group == 'BTS');
print(result);
'Flutter > Dart 문법' 카테고리의 다른 글
[Dart] Stream (Future와 차이점) (0) | 2023.03.24 |
---|---|
[Dart] Async에 대하여 (Future- delayed / await) (0) | 2023.03.24 |
[Dart] cascading (0) | 2023.03.23 |
[Dart] List - reduce / List - fold (0) | 2023.03.23 |
[Dart] List/map에 where사용해보기(where로 필터링) (0) | 2023.03.23 |