3. Parser le JSON

Afin de rendre facilement utilisable le résultat de nos appels à l’API, nous avons besoin de parser le JSON retourné par cette derniere et de le transformer en objet utilisable par l’application.

Parser le JSON

Pour parser un JSON vous pouvez utiliser la classe jsonDecode de la bibliothèque dart:convert.

import 'dart:convert';

void main() {
  String jsonString = '{"message": "Powered by random-d.uk", "url":"https://random-d.uk/api/168.jpg"}';


  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  String message = jsonMap['message'];
  String url = jsonMap['url'];

  DuckEntity duckEntity = DuckEntity(message, url);
  
  print(duckEntity.url);
}

class DuckEntity {
    String message;
    String url;

    DuckEntity(this.message, this.url);
}

Gestion des erreurs

Lors du parsing d’un JSON, plusieurs erreurs peuvent survenir, notamment si la chaîne JSON est malformée ou si elle contient des clés ou des valeurs invalides. Afin de gérer ces erreurs, on peut encapsuler la fonctionnalité de arsing dans un bloc try-catch.

Cela pourra vous aider à cibler votre débug à ce cas la et ainsi traiter l’erreur appropriée dans le bloc catch.

import 'dart:convert';

void main() {
  String jsonString = '{"message": "Powered by random-d.uk", "url":"https://random-d.uk/api/168.jpg"}';


  try {
    Map<String, dynamic> jsonMap = jsonDecode(jsonString);
    String message = jsonMap['message'];
    String url = jsonMap['url'];

    DuckEntity duckEntity = DuckEntity(message, url);
  
    print(duckEntity.url);
  } on Exception catch e {
    print(e);
  } 
}

class DuckEntity {
    String message;
    String url;

    DuckEntity(this.message, this.url);
}

Intégrer le parsing JSON dans la classe objet

Au lieu de créer une instance de DuckEntity manuellement en extrayant les valeurs du JSON, vous pouvez ajouter une méthode factory à la classe DuckEntity pour faciliter la création d’objets à partir de JSON.

Pour rappel, une factory est une méthode de classe qui est utilisée pour créer des instances d’une classe. Contrairement aux constructeurs standard de type MyClass(), les constructeurs de type factory peuvent retourner une instance de classe différente ou même retourner une instance existante (singleton) plutôt que d’en créer une nouvelle à chaque appel.

class DuckEntity {
  String message;
  String url;

  DuckEntity(this.message, this.url);

  factory DuckEntity.fromJson(Map<String, dynamic> json) {
    return DuckEntity(
      json['message'],
      json['url'],
    );
  }
}

Maintenant, vous pouvez créer des instances de DuckEntity directement à partir du JSON en utilisant la méthode factory fromJson :

DuckEntity duckEntity = DuckEntity.fromJson(jsonMap);

Librairies de parsing

Il existe plusieurs bibliothèques tierces qui facilitent encore plus le travail avec JSON dans Dart et Flutter. Certaines des bibliothèques les plus populaires sont json_serializable et freezed. Elles permettent de générer les methodes fromJson, toJson et parfois plus. Lorsque vous avez des objets complexes à gérer cela reste très pratique. Ces librairies permettent de générer des fichiers avec le code necessaire pour effectuer ces conversions.

json_serializable

json_serializable est une bibliothèque qui génère du code pour convertir automatiquement des objets Dart en JSON et vice versa. Pour utiliser json_serializable, vous aurez besoin d’ajouter les dépendances suivantes à votre fichier pubspec.yaml :

Ensuite, vous pouvez annoter votre classe avec @JsonSerializable() et utiliser les annotations @JsonKey() pour configurer la conversion si nécessaire. Vous devrez également exécuter build_runner pour générer le code nécessaire pour la conversion JSON.

freezed

Freezed est une bibliothèque Dart populaire qui facilite la gestion d’état et la sérialisation JSON en générant automatiquement du code. Elle est particulièrement utile lors de la création d’applications Flutter, car elle simplifie la gestion d’état immuable. Cette libriarie génèrera un fichier en .g ainsi qu’un .freezed.

Retournons sur nos canards…

Maintenant, vous pouvez utiliser la classe DuckEntity pour créer des objets immuables et sérialiser/désérialiser JSON :

import 'dart:convert';
import 'duck_entity.dart';

void main() {
  String jsonString = '{"message": "Powered by random-d.uk", "url":"https://random-d.uk/api/168.jpg"}';

  try {
    DuckEntity duckEntity = DuckEntity.fromJson(jsonDecode(jsonString));
    print(duckEntity.url);
  } on Exception catch (e) {
    print(e);
  }
}

En ajoutant cette section sur Freezed, vous fournirez aux lecteurs une autre option pour gérer la sérialisation JSON et la gestion d’état immuable dans leurs applications Dart et Flutter.

Le parsing JSON est une étape cruciale lors de l’utilisation d’APIs et de la communication avec des services Web dans les applications Dart et Flutter.