본문 바로가기
Flutter/Flutter FAQ

Flutter 플러터에서 json으로부터 객체 목록을 역직렬화하는 방법, How to Deserialize a list of objects from json in flutter

by 베타코드 2023. 5. 29.
반응형

질문


저는 json serialization을 위해 dart 패키지 json_serializable을 사용하고 있습니다. 플러터 문서를 살펴보면 다음과 같이 단일 객체를 역직렬화하는 방법이 나와 있습니다:

Future<Post> fetchPost() async {
  final response =
  await http.get('https://jsonplaceholder.typicode.com/posts/1');

  if (response.statusCode == 200) {
  // 서버 호출이 성공하면 JSON을 파싱합니다
  return Post.fromJson(json.decode(response.body));
  } else {
    // 호출이 실패하면 오류를 throw합니다.
    throw Exception('Failed to load post');
  }
}

하지만, 저는 단일 인스턴스 대신 항목 목록을 역직렬화하는 방법을 찾기 위해 dart에 충분히 익숙하지 않습니다.


답변


잘, 당신의 서비스는 응답 본문이 맵인지 아니면 맵의 목록인지에 따라 처리할 것입니다. 당신이 가진 코드를 기반으로 하면, 당신은 1개의 항목을 처리하고 있습니다.

응답 본문이 반복 가능한 경우, 적절하게 구문 분석하고 이동해야 합니다. 제가 당신의 질문을 올바르게 이해하고 있다면요.

예:

Iterable l = json.decode(response.body);
List<Post> posts = List<Post>.from(l.map((model)=> Post.fromJson(model)));

여기서 게시물은 게시물의 목록입니다.

편집: 여기에 명확성에 대한 노트를 추가하고 싶습니다. 여기서의 목적은 반환된 응답을 디코딩하는 것입니다. 다음 단계는 JSON 객체의 반복 가능한 것을 당신의 객체의 인스턴스로 바꾸는 것입니다. 이는 클래스에서 fromJson 메소드를 만들어 JSON을 적절하게 가져와 구현하는 것으로 수행됩니다. 아래는 샘플 구현입니다.

class Post {
  // 클래스와 관련된 다른 함수와 속성
  // ......
  /// Json은 Map<dynamic,dynamic>이라고 기억합니다.
  static fromJson(json): Post {
    Post p = new Post()
    p.name = ...
    return p
  }
}

저는 요즘 Dart에서 약간 추상화되어 있어서, 수행해야 하는 작업에 대한 더 나은 유틸리티를 선호합니다. 그래서 제 문법은 조금 어긋날 수 있지만, 이것은 유사 코드입니다.

반응형

댓글