Constructeur spécifique pour le JSON

Bonjour à tous,

Je rencontre un petit problème avec la création d’un objet suite à la réception d’un fichier JSON.
Mon webservice me renvoie bien un retour 200 et des datas :

« data »: {
« id »: 1,
« scientific_name »: « Boletus edulis »,
« common_name »: « Cèpe de Bordeaux »,

et lorsque je tente de créer un objet avec le constructeur spécifique, il me met l’erreur suivante :

Quelqu’un peut m’aider ?

Merci d’avance !

Salut @Tazooou
Sujet déjà traité ici :
https://forum.purplegiraffe.fr/t/resolu-typeerror-type-string-is-not-a-subtype-of-type-int/3269

A la différence c’est que dans ton cas ta valeur est Null.

Je suis pas certain de comprendre :thinking:
La valeur du champs id est bien sur un format numérique : « id »: 1,
Et il est bien rempli par la valeur 1.
D’ailleurs, la même problématique se pose sur les autres champs String. Le message d’erreur est le même, au delta près qu’il me dit que Null is not a subtype of type’String’

Plus exactement, la réponse est ici :

Faut que tu castes la valeur pour la passer en int. Comme l’explique @alexandre.cane dans le thread qu’il a donné.

[Edit] après réflexion, si la valeur est nulle, est-ce que tu mappes bien ton JSON? Si c’est du nested Json, il faut mapper en 2 temps si je me souviens bien.

Effectivement j’ai l’impression que le json est mal interprété. Car si les champs on un type null c’est qu’il y’a problème.

J’ai tenté d’appliquer le correctif d’alexandre et j’ai toujours le même blocage mais pas la même erreur.
Il me parle de String et plus de int …

Le champ est toujours « null », je pense qu’il y a un problème et que le JSON est mal interprété…(cf. mon EDIT du message précédent).
faudrait voir à afficher ce que te sors la ligne 7 de ton code, avant de remplir ton objet avec les données.

Je viens de faire un print après le jsonDecode (ou plutôt le jsonDeconne dans mon cas … :rofl:) :
Flutter: {data: {id: 1, scientific_name: Boletus edulis, common_name: Cèpe de Bordeaux}}
J’ai l’impression que les clé ne sont même pas en String.

Je remets la réponse de mon webservice :

{"data":{"id":1,"scientific_name":"Boletus edulis","common_name":"Cèpe de Bordeaux"}}

oui mais dans ton code, on voit un
{ « data » :
{« id »:1, etc }
}

Donc tu as un nested JSON, je pense que quand tu essaies de faire ton : id = json["id"] il est en fait dans la structure data et non directement sur l’id.

Peut-être cet article pourra t’aider à comprendre ce qui se passe derrière :

Oui je pense aussi que c’est ça.
@Tazooou fait un print de json[« data »] pour voir !

Je vous confirme que le problème vient bien de là. Je viens de me prendre deux heures de lectures sur les différentes façon de décoder un nested Json, c’est loin d’être simple … :crazy_face:
Je vais tenter de réaliser çà et je vous tiens au courant ! Merci pour votre aide !!!

Ca y est, j’ai trouvé comment dialoguer avec la machine !!!

Je vous partage mon code plus bas. Je l’ai fait au plus simple sans gérer des éventuels exceptions dans le code :

class Fungus {
  final int id;
  final String scientificName;
  final String commonName;

  Fungus(
      {required this.id,
      required this.scientificName,
      required this.commonName});

  factory Fungus.fromJSON(Map<String, dynamic> json) {
    final id = json['id'] as int;
    final scientificName = json['scientific_name'] as String;
    final commonName = json['common_name'] as String;
    return Fungus(
        id: id, scientificName: scientificName, commonName: commonName);
  }
}

class DetailFungusReturn {
  final Fungus data;

  DetailFungusReturn({required this.data});

  factory DetailFungusReturn.fromJSON(Map<String, dynamic> json) {
    final data = Fungus.fromJSON(json['data']);
    return DetailFungusReturn(data: data);
  }
}
2 « J'aime »