2
votes

Analyse de Json en scintillement

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!


3 commentaires

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/...


4 Réponses :


0
votes

Essayez d'utiliser

pics = data.map((i)=>Photo.fromJson(i)).toList();

Vous recevez un tableau json et non un objet json du serveur


2 commentaires

cela donne une erreur:: [ERREUR: flutter / lib / ui / ui_dart_state.cc (148)] Exception non gérée: le type 'List ' n'est pas un sous-type de type 'List '


et quand je le change en dynamique, je ne peux pas accéder à la variable de classe Photo



0
votes

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();


0 commentaires

2
votes

Vous pouvez utiliser quicktype , il vous permet de copier votre chaîne JSON et de générer les objets Dart


0 commentaires

1
votes

Dans mon projet, j'ai fait comme ça et ça marche

pics = (data as List).map((model) => Photo.fromJson(model)).toList();


0 commentaires