J'apprends le flutter et j'essaie d'analyser un json qui est un tableau ou des objets json comme celui-ci.
class Photo {
final int id;
final String title;
final String url;
final String thumbnailUrl;
Photo({this.id, this.title,this.url, this.thumbnailUrl});
factory Photo.fromJson(Map<String, dynamic> json) {
return Photo(
id: json['id'] as int,
title: json['title'] as String,
thumbnailUrl: json['thumbnailUrl'] as String,
url: json['url'] as String,
);
}
}
Et voici ma fonction de récupération qui récupère ces données du serveur.
ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: type '(Map<String, dynamic>, dynamic) => Photo' is not a subtype of type '(dynamic) => dynamic' of 'f'
Mais la ligne;
List<Photo> pics= data.map((Map<String,dynamic> model)=> Photo.fromJson(model)).toList();
me donne une erreur qui:
fetch() async{
var client = new http.Client();
try {
var uriResponse = await
client.get('https://jsonplaceholder.typicode.com/photos');
if(uriResponse.statusCode == 200){
var data = json.decode(uriResponse.body);//data is array of objects
List<Photo> pics= data.map((Map<String,dynamic> model)=> Photo.fromJson(model)).toList();
setState(() {
photos = data;
_isLoading = false;
});
}
} finally {
client.close();
}
}
Voici ma classe Photo PODO.
[
{
"albumId": 1,
"id": 1,
"title": "accusamus beatae ad facilis cum similique qui sunt",
"url": "https://via.placeholder.com/600/92c952",
"thumbnailUrl": "https://via.placeholder.com/150/92c952"
},
{
"albumId": 1,
"id": 2,
"title": "reprehenderit est deserunt velit ipsam",
"url": "https://via.placeholder.com/600/771796",
"thumbnailUrl": "https://via.placeholder.com/150/771796"
},]
Qu'est-ce que je fais mal dans le code ci-dessus? Merci d'avance!
4 Réponses :
Essayez d'utiliser
pics = data.map((i)=>Photo.fromJson(i)).toList();
Vous recevez un tableau json et non un objet json du serveur
cela donne une erreur:: [ERREUR: flutter / lib / ui / ui_dart_state.cc (148)] Exception non gérée: le type 'List
et quand je le change en dynamique, je ne peux pas accéder à la variable de classe Photo
essayez ceci si cela n'a pas fonctionné assurez-vous d'afficher le corps de la réponse
Iterable<dynamic> l = json.decode(uriResponse.body); List<Post> posts = l.map((model) => Post.fromJson(model)).toList();
Vous pouvez utiliser quicktype , il vous permet de copier votre chaîne JSON et de générer les objets Dart
Dans mon projet, j'ai fait comme ça et ça marche
pics = (data as List).map((model) => Photo.fromJson(model)).toList();
Avez-vous essayé d'utiliser json_serializable ?
Pour une analyse JSON avancée, vous pouvez utiliser built_value .
Le meilleur moyen d'utiliser json en ligne pour lancer pojo stackoverflow.com/questions/51901760/...