Parsing JSON avec dart:convert
1. dart:convert
Dans de nombreuses applications Dart/Flutter, vous devez travailler assez souvent avec des données au format JSON. Dans cet article, on va apprendre à utiliser la bibliothèque dart:convert pour analyser manuellement les données JSON. Il s'agit d'une bibliothèque intégrée à Dart et convient aux petits projets.
Pour les applications avec des modèles JSON plus complexes, l'utilisation de dart:convert peut rapidement devenir fastidieuse, répétitive et entraîner de nombreuses petites erreurs. Dans ce cas, vous devez utiliser la bibliothèque dart_json_mapper ou json_serializable.
- Dart json serializable
Bien qu'il existe maintenant de nombreuses bibliothèques Dart JSON fournies par la communauté, elles ne sont pas aussi diverses que Java. Vous pouvez poser la question "Existe-t-il une bibliothèque équivalente à GSON/Jackson/Moshi de Java ?". La réponse est oui, c'est dart_json_mapper.
En tant que bibliothèque simple, dart:convert ne nécessite aucune configuration supplémentaire et c'est la première bibliothèque de traitement JSON à laquelle vous devez penser, pour les petits projets.
Certaines fonctions sont fournies par la bibliothèque dart:convert :
// JSON ==> Dart Object.
dynamic jsonDecode(
String source, {
Object? reviver(Object? key, Object? value)?,
})
// Dart Object ==> JSON
String jsonEncode(
Object? object, {
Object? toEncodable(Object? nonEncodable)?,
})
2. jsonDecode(..)
dynamic jsonDecode(
String source, {
Object? reviver(Object? key, Object? value)?,
})
La fonction jsonDecode() est utilisée pour analyser un texte JSON et retourner un objet Dart. Cette fonction renvoie un type dynamic. Ce type de retour peut être :
- Map<String,dynamic>
- List<dynamic>
- Un objet Dart si le paramètre reviver n'est pas null (voir un exemple ci-dessous).
Les paramètres :
- source: Un texte en format JSON.
- reviver: Une fonction facultative convoquée pour chaque propriété trouvée lors de l'analyse de ce texte JSON. Le paramètre [key=null] correspond à l'objet JSON global. Les propriétés de niveau feuille seront exécutées en premier, les propriétés de niveau racine seront exécutées en dernier.
Situation où la fonction jsonDecode(json) renvoie Map<String,dynamic>: | Situation où la fonction jsonDecode(json) renvoie List<dynamic>: |
|
|
Par exemple : La fonction jsonDecode() renvoie une Map<String,dynamic>:
json_jsonDecode_ex1.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "john@example.com",
"salary": 5000,
"addresses": ["Address 1", "Address 2"]
}''';
Map<String, dynamic> map = jsonDecode(jsonString);
for (var key in map.keys) {
print('$key --> ${map[key]}');
}
print(' --- ');
List<dynamic> addresses = map['addresses'];
for(String address in addresses) {
print('Address: $address');
}
}
Output:
name --> John Smith
email --> john@example.com
salary --> 5000
addresses --> [Address 1, Address 2]
---
Address: Address 1
Address: Address 2
Un autre exemple avec JSON plus complexe :
json_jsonDecode_ex2.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "john@example.com",
"children": [
{
"name": "Jack Smith",
"email": "jack@example.com"
},
{
"name": "Harry Smith",
"email": "harry@example.com"
}
]
}''';
Map<String, dynamic> map = jsonDecode(jsonString);
for (var key in map.keys) {
print('$key --> ${map[key]}');
}
print(' --- ');
List<dynamic> children = map['children'];
for (dynamic child in children) {
var childMap = child as Map<String, dynamic>;
for (var k in childMap.keys) {
print(' $k --> ${childMap[k]}');
}
}
}
Output:
name --> John Smith
email --> john@example.com
children --> [{name: Jack Smith, email: jack@example.com}, {name: Harry Smith, email: harry@example.com}]
---
name --> Jack Smith
email --> jack@example.com
name --> Harry Smith
email --> harry@example.com
Exemple : La fonction jsonDecode() renvoie une List<dynamique> :
json_jsonDecode_ex3.dart
import 'dart:convert';
void main() {
var jsonString = '''[
{
"name": "Jack Smith",
"email": "jack@example.com"
},
{
"name": "Harry Smith",
"email": "harry@example.com"
}
]''';
List<dynamic> list = jsonDecode(jsonString);
for (var element in list) {
var map = element as Map<String, dynamic>;
for (var k in map.keys) {
print('$k --> ${map[k]}');
}
}
}
Output:
name --> Jack Smith
email --> jack@example.com
name --> Harry Smith
email --> harry@example.com
3. jsonDecode(..). JSON --> Dart
Par exemple, convertissez un JSON en objet Dart.
json_to_dart_ex1.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "john@example.com",
"contact": {
"address": "Address 1",
"phone": "12345"
}
}''';
Employee emp = Employee.fromJsonString(jsonString);
print('Emp Name: ${emp.name}');
print('Emp Email: ${emp.email}');
print('Address: ${emp.contact.address}');
}
class Employee {
String name;
String email;
Contact contact;
// Constructor
Employee(this.name, this.email, this.contact);
static Employee fromMap(Map<String, dynamic> map) {
String name = map['name'];
String email = map['email'];
Map<String, dynamic> contactMap = map['contact'];
Contact contact = Contact.fromMap(contactMap);
return Employee(name, email, contact);
}
static Employee fromJsonString(String jsonString) {
Map<String, dynamic> map = jsonDecode(jsonString);
return fromMap(map);
}
}
class Contact {
String address;
String phone;
// Constructor
Contact(this.address, this.phone);
static Contact fromMap(Map<String, dynamic> map) {
String address = map['address'];
String phone = map['phone'];
return Contact(address, phone);
}
static Contact fromJsonString(String jsonString) {
Map<String, dynamic> map = jsonDecode(jsonString);
return fromMap(map);
}
}
Output:
Emp Name: John Smith
Emp Email: john@example.com
Address: Address 1
Example 2: JSON --> Dart
json_to_dart_ex2.dart
import 'dart:convert';
void main() {
// Department and Staffs
var jsonString = '''{
"deptNo" : "D001",
"deptName": "Sales",
"staffs": [
{ "name": "Tom", "phone": "111222"},
{ "name": "Jerry", "phone": "222333"},
{ "name": "Donald", "phone": "333444"}
]
}''';
Department dept = Department.fromJsonString(jsonString);
print('Dept No: ${dept.deptNo}');
print('Dept Name: ${dept.deptName}');
print('Staff Count: ${dept.staffs.length}');
Staff firstStaff = dept.staffs[0];
print("First Staff Name: ${firstStaff.name}");
}
class Department {
String deptNo;
String deptName;
List<Staff> staffs;
Department(this.deptNo, this.deptName, this.staffs);
static Department fromMap(Map<String, dynamic> map) {
String deptNo = map['deptNo'];
String deptName = map['deptName'];
List<dynamic> list = map["staffs"];
List<Staff> staffs = list.map((dynamic e) => Staff.fromMap(e)).toList();
return Department(deptNo, deptName, staffs);
}
static Department fromJsonString(String jsonString) {
Map<String, dynamic> map = jsonDecode(jsonString);
return fromMap(map);
}
}
class Staff {
String name;
String phone;
Staff(this.name, this.phone);
static Staff fromMap(Map<String, dynamic> map) {
String name = map['name'];
String phone = map['phone'];
return Staff(name, phone);
}
}
Output:
Dept No: D001
Dept Name: Sales
Staff Count: 3
First Staff Name: Tom
4. jsonEncode(..)
String jsonEncode(
Object? object, {
Object? toEncodable(Object? nonEncodable)?,
})
La fonction jsonEncode() est utilisée pour convertir un objet Dart en un texte JSON.
Les paramètres :
- object: Un objet Dart.
- toEncodable: Une fonction facultative utilisée pour convertir des objets Dart non encodables en objets encodables. Si ce paramètre n'est pas fourni, la fonction toJson() sera utilisée comme alternative.
Exemple : Un objet Dart avec toutes les propriétés encodables (Encodable) :
// An Encodable object:
var employee = {
'name': 'John Smith',
'email': 'john@example.com',
'contact': {
'address': 'Address 1',
'phone': '12345'
}
};
Exemple : Un objet Dart avec plusieurs propriétés encodables et une propriété non encodable :
var employee = {
'name': 'John Smith', // Encodable
'email': 'john@example.com', // Encodable
'contact': Contact('Address 1', '12345') // Unencodable!!!
};
Exemple : L'utilisation de la fonction jsonEncode() pour convertir un objet Dart en texte JSON :
json_jsonEncode_ex1.dart
import 'dart:convert';
void main() {
// An Object (Looks like a JSON):
var employee = {
'name': 'John Smith',
'email': 'john@example.com',
'contact': {
'address': 'Address 1',
'phone': '12345'
}
};
var jsonString = jsonEncode(employee);
print(jsonString);
}
Output:
{"name":"John Smith","email":"john@example.com","contact":{"address":"Address 1","phone":"12345"}}
Exemple : La conversion d'un objet Map en texte JSON :
json_jsonEncode_ex2.dart
import 'dart:convert';
void main() {
var map = Map<String,dynamic>();
map['name'] = 'John Smith';
map['email'] = 'john@example.com';
var jsonString = jsonEncode(map);
print(jsonString);
}
Output:
{"name":"John Smith","email":"john@example.com"}
Exemple : L'utilisation de la fonction jsonEncode() avec le paramètre toEncodable :
json_jsonEncode_toEncodable_ex1.dart
import 'dart:convert';
void main() {
var contact = Contact('Address 1', '12345');
var employee = {
'name': 'John Smith', // Encodable
'email': 'john@example.com', // Encodable
'contact': contact // Un-encodable!!!
};
var jsonString = jsonEncode(employee, toEncodable: (nonEncodable) {
if (nonEncodable is Contact) {
return {
'address': nonEncodable.address,
'phone': nonEncodable.phone
};
}
return null;
});
print(jsonString);
}
class Contact {
String address;
String phone;
Contact(this.address, this.phone); // Constructor
}
Output:
{"name":"John Smith","email":"john@example.com","contact":{"address":"Address 1","phone":"12345"}}
Exemple : L'utilisation de la fonction jsonEncode() avec le paramètre toEncodable :
json_jsonEncode_toEncodable_ex2.dart
import 'dart:convert';
void main() {
var contact = Contact('Address 1', '12345');
var employee = Employee('John Smith', 'john@example.com', contact);
var jsonString = jsonEncode(employee, toEncodable: (nonEncodable) {
if (nonEncodable is Contact) {
return {
'address': nonEncodable.address,
'phone': nonEncodable.phone
};
} else if(nonEncodable is Employee) {
return {
'name': nonEncodable.name,
'email': nonEncodable.email,
'contact': nonEncodable.contact
};
}
});
print(jsonString);
}
class Contact {
String address;
String phone;
Contact(this.address, this.phone); // Constructor
}
class Employee {
String name;
String email;
Contact contact;
Employee(this.name, this.email, this.contact); // Constructor
}
Tutoriels de programmation Dart
- Type de données Boolean dans Dart
- Fonctions dans Dart
- Fermetures dans Dart
- Méthodes dans Dart
- Propriétés en Dart
- Programmation Dart avec l'outil en ligne DartPad
- Installer Dart SDK sur Windows
- Installer Visual Studio Code sur Windows
- Installer Dart Code Extension pour Visual Studio Code
- Installer Dart Plugin pour Android Studio
- Exécutez votre premier exemple Dart en Visual Studio Code
- Exécutez votre premier exemple Dart en Android Studio
- Parsing JSON avec dart:convert
- Le Tutoriel de Dart List
- Variables dans Dart
- Le Tutoriel de Dart Map
- Les Boucles en Dart
- Analyser Dart JSON avec le package dart_json_mapper
- Qu'est-ce que Transpiler?
Show More