Nested JSON - Decoder un JSON complexe

Bonjour à tous,

J’ai besoin de vos lumières vu que je sèche depuis plusieurs jours sur ce très pénible problème.

Voila, je passe par un service d’API qui me renvoie un JSON lors d’une requête (Directus). Le problème que je rencontre est que le JSON n’est pas un JSON simple (un nested JSON comme on dit apparemment), qui a le format suivant :

{
« data »: [
{
« id »: « 46ba1359-9b8f-4d0d-94f3-3876fbe9147b »,
« status »: « published »,
« sort »: null,
« date_created »: « 2021-07-31T18:20:01+02:00 »,
« name »: « TRUC »,
« birthdate »: « 2011-06-04 »,
« race »: « KWPN »,
« propname »: « Moi »,
« profilpicture »: « c1ef0fb0-99a3-44a3-9fc6-e0e8df9714a2 »,
« frontlefthoof »: null
}
]
}

Le code est le suivant pour ma class Horse :

class Horse {
  final String id;
  final String name;
  final int birthDate;
  final String race;
  final String propName;
  // gestion des photos à faire
  final String profilPicture;

  Horse(this.name, this.birthDate, this.race, this.propName, this.profilPicture,
      this.id);
  Horse.fromJSON(Map<String, dynamic> json)
      : id = json["id"],
        name = json["name"],
        birthDate = json["birthdate"],
        race = json["race"],
        propName = json["propname"],
        profilPicture = json["profilpicture"];
}

Et la partie ou je veux charger le JSON dans mon code :

  Future<dynamic> _listHorse() async {
    final uri = Uri.parse(
        "http://localhost:8055/items/horse");
    final response = await http.get(uri);
    if (response.statusCode == 200) {
      final List horseJsonList = jsonDecode(response.body);
      late final horselist =
          horseJsonList.map((json) => Horse.fromJSON(json)).toList();

      return horselist;
    } else {
      throw Exception("Erreur de chargement des données");
    }
  }

Quand je lance l’appli pour tester, je me retrouve avec cette erreur :

_TypeError (type ‹ _InternalLinkedHashMap<String, dynamic> › is not a subtype of type ‹ List ›)

J’ai bien compris que je passe par une liste, alors que le jsondecode me renvoie un MAP (avec clef/valeur) mais j’arrive pas à trouver un moyen de régler ce soucis (j’ai testé plein de trucs, y compris de passer par une class qui me fait une liste mais j’en suis toujours au même point)…Faut-il passer par une boucle? Je sèche complètement…

Je vous remercie d’avance pour votre aide, j’espère avoir bien décris le soucis !

J’ai avancé encore un peu, mais toujours une erreur.
cette fois sur un cast/type.

Le code modifié de la fonction :

  Future<List<Horse>> _listHorse() async {
    final uri = Uri.parse("http://localhost:8055/items/horse");
    final response = await http.get(uri);
    if (response.statusCode == 200) {
      final json = jsonDecode(response.body);
      final horseJson = (json['data']);
      final List<Horse> horse = horseJson.map((horseGroup) {
        return Horse.fromJSON(horseGroup as Map<String, dynamic>);
      }).toList();
      return horse;
    } else {
      throw Exception("Erreur de chargement des données");
    }
  }

Et l’erreur :

 _TypeError (type 'List<dynamic>' is not a subtype of type 'List<Horse>')

Sur la ligne :

 final List<Horse> horse = horseJson.map((horseGroup)

Voila j’ai l’impression de tourner en boucle (while sans condition… :sweat_smile:)
Je dois faire un cast ? J’en ai tenté mais sans résultat.
C’est quand même dingue de pas arriver à lire un simple JSON nested tout bête…

Bon, j’ai réussi à trouver une solution, mais qui ne me convient qu’à moitié.
En fait, dans les ‹ List< Horse > › j’ai remplacé par ‹ List< dynamic > › et ça fonctionne…

Si toutefois y’a des idées de votre côté, je suis preneur.

Bon code à tous :slight_smile: