#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);
}