devstory

Analyser Dart JSON avec le package dart_json_mapper

  1. dart_json_mapper
  2. L'installation de la bibliothèque
  3. Par exemple
  4. Appendice

1. dart_json_mapper

dart_json_mapper est une bibliothèque qui fournit une meilleure solution que dart:convert pour travailler avec des données JSON. Il convient aux applications avec des modèles JSON complexes. Cependant, pour l'utiliser, il est nécessaire d'effectuer quelques étapes de configuration. Pour les petites applications, vous devez utiliser la bibliothèque dart:convert - c'est simple et n'exige d'aucune configuration supplémentaire.
La bibliothèque dart_json_mapper inspirée de json2typescript, serde, gson, qui dispose de mêmes fonctionnalités comparables à Java Jackson, est très populaire et n'a que quatre annotations à retenir pour couvrir tous les cas d'utilisation possibles.
dart_json_mapper vs json_serializable
json_serializable est une meilleure bibliothèque de gestion JSON que dart:convert. Cependant, il ne s'agit que d'une bibliothèque semi-automatique et ne peut être comparée aux fonctionnalités offertes par dart_json_mapper.
  • Dart json serializable

2. L'installation de la bibliothèque

Pour utiliser la bibliothèque dart_json_mapper, il est impératif de la déclarer dans le fichier pubspec.yaml :
pubspec.yaml
dependencies:
  dart_json_mapper:

dev_dependencies:
  build_runner:

3. Par exemple

Tout d'abord, ajouter le fichier build.yaml à votre projet. Il s'agit du fichier de configuration, utilisé pour demander à build_runner de générer de nouveaux fichiers de code source à partir des fichiers de code source spécifiés.
build.yaml
targets:
  $default:
    builders:
      dart_json_mapper:
        generate_for:
          # here should be listed entry point files having 'void main()' function
          - lib/model/model.dart

      # This part is needed to tell original reflectable builder to stay away
      # it overrides default options for reflectable builder to an **empty** set of files
      reflectable:
        generate_for:
          - no/files
Ensuite, créez les classes Model:
dart_14139_dart_json_mapper (Your Project Name)
  - lib
      - model
           - model.dart
           - model_file1.dart
           - model_file2.dart
@jsonSerializable
Cette annotation est utilisée pour une classe. La bibliothèque dart_json_mapper générera du code pour convertir les objets de cette classe en JSON et vice versa.
@JsonProperty
Cette annotation est une option utilisée pour les propriétés de classe. Il spécifie le nom de propriété JSON qui correspond à un nom de propriété de classe s'ils sont différents.
@jsonSerializable
class Employee {
  @JsonProperty(name: 'employeeName') // JSON Property
  String name; // Dart Property 
  String email;
  ...
}
@jsonSerializable
class Employee { 
  @JsonProperty(ignore: true)
  String? privateEmail; // This property will be Ignored.
}
Utilisez @JsonProperty(ignore:true) pour qu'une propriété l'ignore.
model_file1.dart : Contenir les classes Contact et Employee, avec des règles pour les convertir en structures JSON et vice versa.
model_file1.dart
part of 'model.dart';

@jsonSerializable
class Contact {
  String address;
  String phone;

  Contact(this.address, this.phone); // Constructor
}

@jsonSerializable
class Employee {
  @JsonProperty(name: 'employeeName') // JSON Property Name!!
  String name; // Dart Property Name
  String email;
  Contact contact;

  @JsonProperty(ignore: true) 
  String? privateEmail; // This property will be Ignored.

  Employee(this.name, this.email, this.contact); // Constructor
}
model_file2.dart : Contenir la classe Company, avec des règles pour la convertir en structures JSON et vice versa.
model_file2.dart
part of 'model.dart';

@jsonSerializable
class Company {
  @JsonProperty(name: 'companyName') // JSON Property Name
  String name; // Dart Property Name
  Contact contact;

  Company(this.name, this.contact); // Constructor
}
  • The part and part of keywords in Dart
model.dart
import 'package:dart_json_mapper/dart_json_mapper.dart';

part 'model_file1.dart';
part 'model_file2.dart';

// This main() function is required!
void main() {
  // Empty
}
Ouvrir une fenêtre Terminal sur l'IDE :
  • View > Terminal (Visual Studio Code)
  • View > Tool Windows > Terminal (Android Studio)
Exécutez la commande ci-dessous pour que dart_json_mapper génère du code d'extension pour les classes Model.
dart run build_runner build --delete-conflicting-outputs
Consultez l'annexe à la fin de l'article si vous recevez une erreur lorsque vous essayez d'exécuter cette commande:
dart run build_runner build --delete-conflicting-outputs
dart run build_runner build --delete-conflicting-outputs
[INFO] Generating build script completed, took 415ms
[INFO] Reading cached asset graph completed, took 144ms
[INFO] Checking for updates since last build completed, took 768ms
[INFO] Running build completed, took 3.7s
[INFO] Caching finalized dependency graph completed, took 83ms
[INFO] Succeeded after 3.8s with 31 outputs (61 actions)
L'outil vous génère un fichier Dart. S'il y a des modifications dans les classes Model, exécutez à nouveau la commande ci-dessus.
  • model.mapper.g.dart
Dart object ==> JSON:
Cet exemple vous montre comment convertir un objet Dart en texte JSON:
test_dart_to_json_ex1.dart
import 'package:dart_json_mapper/dart_json_mapper.dart';

import 'model/model.dart';
import 'model/model.mapper.g.dart';

void main() {
  initializeJsonMapper(); // <-----------------------

  var contact = Contact('Address 1', '12345');
  var employee = Employee('John Smith', 'john@example.com', contact);

  var jsonString = JsonMapper.toJson(employee);
  print(jsonString);

  print(' --------------------------- ');

  contact = Contact('Address 1', '99999');
  var company = Company('Google', contact);
  jsonString = JsonMapper.toJson(company);

  print(jsonString);
}
Output:
{
 "employeeName": "John Smith",
 "email": "john@example.com",
 "contact": {
  "address": "Address 1",
  "phone": "12345"
 }
}
 ---------------------------
{
 "companyName": "Google",
 "contact": {
  "address": "Address 1",
  "phone": "99999"
 }
}
JSON ==> Dart object:
Ci-dessous un exemple qui convertit un texte JSON en objet Dart :
test_json_to_dart_ex1.dart
import 'package:dart_json_mapper/dart_json_mapper.dart';

import 'model/model.dart';
import 'model/model.mapper.g.dart';

void main() {
  initializeJsonMapper(); // <-----------------------

  var jsonString1 = '''{
      "employeeName": "John Smith",
      "email": "john@example.com",
      "contact": {
        "address": "Address 1",
        "phone": "12345"
        }
      }''';

  // May be null:
  var employee = JsonMapper.fromJson<Employee>(jsonString1);
  print('Employee Phone: ${employee!.contact.phone}');

  print(' --------------------------- ');

  var jsonString2 = '''{
    "companyName": "Google",
    "contact": {
      "address": "Address 1",
      "phone": "99999"
      }
    }''';
  // May be null:
  var company = JsonMapper.fromJson<Company>(jsonString2);
  print('Company Phone: ${company!.contact.phone}');
}
Output:
Employee Phone: 12345
 ---------------------------
Company Phone: 99999
Map<String,dynamic> ==> Dart object:
test_map_to_dart_ex1.dart
import 'package:dart_json_mapper/dart_json_mapper.dart';

import 'model/model.dart';
import 'model/model.mapper.g.dart';

void main() {
  initializeJsonMapper(); // <-----------------------

  Map<String, dynamic> map1 = {
    "employeeName": "John Smith",
    "email": "john@example.com",
    "contact": {"address": "Address 1", "phone": "12345"}
  };

  // May be null:
  var employee = JsonMapper.fromMap<Employee>(map1);
  print('Employee Phone: ${employee!.contact.phone}');

  print(' --------------------------- ');

  Map<String, dynamic> map2 = {
    "companyName": "Google",
    "contact": {"address": "Address 1", "phone": "99999"}
  };
  // May be null:
  var company = JsonMapper.fromMap<Company>(map2);
  print('Company Phone: ${company!.contact.phone}');
}
Output:
Employee Phone: 12345
 --------------------------- 
Company Phone: 99999

4. Appendice

dart run build_runner build --delete-conflicting-outputs
Si vous recevez une erreur lorsque vous essayez d'exécuter la commande ci-dessus, essayez la solution ci-dessous:
If your project is DART:
  • File > Settings > Languages & Frameworks > Dart > Dart SDK path (Windows/Linux)
  • Android Studio > Settings > Languages & Frameworks > Dart > Dart SDK path (Mac)
Run:
/Volumes/Apps/Apps/dart-sdk/bin/dart run build_runner build --delete-conflicting-outputs
If your project is FLUTTER:
Run:
/Volumes/Apps/Apps/flutter/bin/dart run build_runner build --delete-conflicting-outputs