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
.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);
}
Modélisation des données avec Freezed
Freezed est une bibliothèque Dart qui facilite la création de classes immuables tout en générant automatiquement du code pour des fonctionnalités comme l'égalité par valeur, les copies d'objets, et la gestion des données en JSON. Freezed génère également du code pour la sérialisation et la désérialisation JSON via json_serializable
.
Exemple rapide :
import 'package:freezed_annotation/freezed_annotation.dart';
part 'duck.freezed.dart';
part 'duck.g.dart';
@freezed
class Duck with _$Duck {
factory Duck({
required String message,
required String url,
}) = _Duck;
factory Duck.fromJson(Map<String, dynamic> json) => _$DuckFromJson(json);
}
L'intérêt principal est de rendre le code plus concis, robuste et moins sujet aux erreurs, tout en automatisant des tâches répétitives comme la gestion de JSON ou les comparaisons par valeur.
Parsing avec la métaprogrammation
Le metaprogramming en Dart permet de générer du code au moment de la compilation à l'aide d'annotations. Cela inclut la sérialisation et désérialisation JSON via des annotations comme celles fournies par json_serializable
. Plutôt que de manuellement parser les objets JSON, Dart peut utiliser des annotations pour générer automatiquement le code de conversion JSON.
Exemple rapide :
import 'package:json_annotation/json_annotation.dart';
part 'duck.g.dart';
@JsonSerializable()
class Duck {
final String message;
final String url;
Duck({required this.message, required this.url});
factory Duck.fromJson(Map<String, dynamic> json) => _$DuckFromJson(json);
Map<String, dynamic> toJson() => _$DuckToJson(this);
}
Le principal avantage de cette approche est de réduire le risque d'erreurs lors du parsing JSON tout en automatisant des tâches souvent fastidieuses.