Как десериализовать список объектов из json в flutter
Я использую пакет dart json_serializable для сериализации json. Глядя на документацию флаттера, он показывает, как десериализовать один объект следующим образом:
Future<Post> fetchPost() async {
final response =
await http.get('https://jsonplaceholder.typicode.com/posts/1');
if (response.statusCode == 200) {
// If the call to the server was successful, parse the JSON
return Post.fromJson(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}
Тем не менее, я недостаточно хорошо знаком с дротиками, чтобы выяснить, как сделать то же самое для списка элементов вместо одного экземпляра.
Ответы
Ответ 1
Ну, ваш сервис будет обрабатывать либо тело ответа, являющееся картой, либо список карт соответственно. Исходя из имеющегося у вас кода, вы учитываете 1 товар.
Если тело ответа является итеративным, то вам нужно соответствующим образом проанализировать и пройтись, если я правильно понимаю ваш вопрос.
Пример:
Iterable l = json.decode(response.body);
List<Post> posts = l.map((Map model)=> Post.fromJson(model)).toList();
где сообщения - это список сообщений.
РЕДАКТИРОВАТЬ: я хотел бы добавить примечание ясности здесь. Цель здесь в том, чтобы вы расшифровали ответ. Следующий шаг - превратить эту итерируемую из объектов json в экземпляр вашего объекта. Это достигается созданием методов fromJson в вашем классе, чтобы правильно взять json и реализовать его соответствующим образом. Ниже приведен пример реализации.
class Post {
// Other functions and properties relevant to the class
// ......
/// Json is a Map<dynamic,dynamic> if i recall correctly.
static fromJson(json): Post {
Post p = new Post()
p.name = ...
return p
}
}
Я немного отвлечен от Дарт в эти дни в пользу лучшей утилиты для задач, которые необходимо выполнить. Так что мой синтаксис, скорее всего, немного отключен, но это псевдокод.
Ответ 2
Еще один пример в JSON Parsing для дальнейшего уточнения.
Пусть говорят, что мы хотим проанализировать массив элементов в нашем объекте JSON.
factory YoutubeResponse.fromJSON(Map<String, dynamic> YoutubeResponseJson)
{
// Below 2 line code is parsing JSON Array of items in our JSON Object (YouttubeResponse)
var list = YoutubeResponseJson['items'] as List;
List<Item> itemsList = list.map((i) => Item.fromJSON(i)).toList();
return new YoutubeResponse(
kind: YoutubeResponseJson['kind'],
etag: YoutubeResponseJson['etag'],
nextPageToken: YoutubeResponseJson['nextPageToken'],
regionCode: YoutubeResponseJson['regionCode'],
mPageInfo: pageInfo.fromJSON(YoutubeResponseJson['pageInfo']),
// Here we are returning parsed JSON Array.
items: itemsList);
}
Ответ 3
Сначала создайте класс, соответствующий вашим данным json, в моем случае я создаю (генерирую) класс с именем Img
:
import 'dart:convert';
Img imgFromJson(String str) => Img.fromJson(json.decode(str));
String imgToJson(Img data) => json.encode(data.toJson());
class Img {
String id;
String img;
dynamic decreption;
Img({
this.id,
this.img,
this.decreption,
});
factory Img.fromJson(Map<String, dynamic> json) => Img(
id: json["id"],
img: json["img"],
decreption: json["decreption"],
);
Map<String, dynamic> toJson() => {
"id": id,
"img": img,
"decreption": decreption,
};
}
PS. Вы можете использовать app.quicktype.io для генерации вашего класса данных json в dart.
затем отправьте сообщение/получите на свой сервер:
Future<List<Img>> _getimages() async {
var response = await http.get("http://192.168.115.2/flutter/get_images.php");
var rb = response.body;
// store json data into list
var list = json.decode(rb) as List;
// iterate over the list and map each object in list to Img by calling Img.fromJson
List<Img> imgs = list.map((i)=>Img.fromJson(i)).toList();
print(imgs.runtimeType); //returns List<Img>
print(imgs[0].runtimeType); //returns Img
return imgs;
}
для получения дополнительной информации, это статья о синтаксическом анализе JSON в Flutter