Ожидалось значение типа » Карта», но получено значение типа » Список»

#json #flutter #serialization #flutter-web

Вопрос:

Я новичок в flutter и разрабатываю веб-приложение с использованием flutter Web и RESTful API для серверной части. Я пытаюсь сделать запрос get, однако я получаю ошибку «Ожидал значение типа»Карта<Строка, динамическая>», но получил один из списка типов», которые пытались отладить на основе предложений, найденных здесь на StackOverflow, но я, похоже, не могу решить эту проблему. Вот скриншот ошибки, которую я получаю: введите описание изображения здесь

Мой ответ API выглядит следующим образом

 {
  "page": 1,
  "pages": 1,
  "pageSize": 20,
  "totalRows": 3,
  "estates": [ {
    "id": "ccd442ae-471b-44c6-9eb3-e3c1dccab9f1",
    "name": "sarova group of hotels",
    "description": "An excuisite provider of luxury hotels and state–of–the–art apartments and villas.",
    "rating": 4,
    "city": {
      "id": "1a861a5a-e793-45cb-9a41-71c5b538da05", "name": "mogadishu", "country": "somalia", "countryISO": "so", "latitude": -1.286389, "longitude": 35.817223, "picture": "https://images.adsttc.com/media/images/5016/4cd3/28ba/0d14/1600/0340/slideshow/stringio.jpg"
    }
    ,
    "startingPricePerNight": 0,
    "checkInTime": "00:00:00",
    "checkOutTime": "00:00:00",
    "isVerified": false,
    "estateGroups": []
  }
  ,
  ]
} 

И мой ответ API выглядит так

 Future < List < EstateSearch >> search(searchText, destination, rating, checkinDate,
  checkoutDate, adult, child, infant, rooms, travelPurpose, page) async {
  var searchUrl =
    "${ApiEndPoint.baseUrl}/estate?q=$searchTextamp;dest_type=$destinationamp;rating=$ratingamp;checkin_date=$checkinDateamp;checkout_date=$checkoutDateamp;no_adults=$adultamp;no_children=$childamp;no_infant=$infantamp;no_rooms=$roomsamp;travel_purpose=$travelPurposeamp;page=$page";
  http.Response response = await http.get(
    Uri.parse(searchUrl),
    headers: {
      "Content-Type": "application/json"
    },
  );
  // print('ResonseBody'   '${response.body}');
  List < EstateSearch > estateList = [];
  var estates =
    (jsonDecode(response.body) as Map < String, dynamic > )["estates"];
  estateList = estates.map((i) => EstateSearch.fromJson(i)).toList();
  return estateList;
} 

И сериализованная модель выглядит так

 class EstateSearch extends Paginator {
  String id;
  String name;
  String description;
  int rating;
  City city;
  double startingPricePerNight;
  String checkInTime;
  String checkOutTime;
  bool isVerified;
  EstateGroup estateGroups;

  EstateSearch({
    required this.id,
    required this.name,
    required this.description,
    required this.rating,
    required this.city,
    required this.startingPricePerNight,
    required this.checkInTime,
    required this.checkOutTime,
    this.isVerified = false,
    required this.estateGroups,
  });
  factory EstateSearch.fromJson(Map < String, dynamic > json) =>
    _$EstateSearchFromJson(json);
  Map < String, dynamic > toJson() => _$EstateSearchToJson(this);
} 

Комментарии:

1. Похоже, что конструктор фабрики получает список вместо карты. Не могли бы вы проверить с помощью отладчика, какой тип данных передается конструктору во время выполнения. Возможно ли, что это список карт?

2. @Csisanyi, да, конструктор получает список вместо карты, как я могу исправить это, чтобы он получал карту

Ответ №1:

попробуйте сделать это для возвращаемого значения на сервисе

 final data = json.decode(response.body);
return List<EstateSearch>.from(data['estates'].map((item) => EstateSearch.fromJson(item)));
 

Комментарии:

1. Я попробовал ваше предложение, и оно возвращает ту же ошибку, что и мое решение выше. Ошибка: Ожидалось значение типа » Карта<Строка, динамическая>», но получено значение типа » Список<Строка, динамическая><динамическая>»

Ответ №2:

Я определил, что ошибка была в моем классе модели(EstateSearch), где я передавал группы объектов типа «EstateSearch», в то время как ответ API возвращал список групп объектов. Так что мне оставалось только изменить модель на эту:

 @JsonSerializable(explicitToJson: true)
class EstateSearch extends Paginator {
  String id;
  String name;
  String description;
  int rating;
  City city;
  double startingPricePerNight;
  String checkInTime;
  String checkOutTime;
  bool isVerified;
  List estateGroups = []; // replaced "EstateGroup estateGroups"

  EstateSearch({
    required this.id,
    required this.name,
    required this.description,
    required this.rating,
    required this.city,
    required this.startingPricePerNight,
    required this.checkInTime,
    required this.checkOutTime,
    this.isVerified = false,
    required this.estateGroups,
  });
  factory EstateSearch.fromJson(Map < String, dynamic > json) =>
    _$EstateSearchFromJson(json);
  Map < String, dynamic > toJson() => _$EstateSearchToJson(this);
}