devstory

Analyser Dart JSON avec le package dart_json_mapper

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

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.

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/src/model_file1.dart
          - lib/src/model_file2.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éer 2 fichiers dans le répertoire "lib/src". Les fichiers placés dans ce répertoire ne sont utilisés qu'en interne par votre projet. Si vous voulez qu'ils soient utilisables dans d'autres projets, il faut les placer dans le dossier "lib".
dart_json_mapper_tutorial (Your Project Name)
  - lib
      - src
           - model_file1.dart
           - model_file2.dart
model_file1.dart : Contenir les classes Contact et Employee, avec des règles pour les convertir en structures JSON et vice versa.
lib/src/model_file1.dart
import 'package:dart_json_mapper/dart_json_mapper.dart'
    show JsonMapper, jsonSerializable, JsonProperty;

@jsonSerializable
class Contact {
  String address;
  String phone;
  Contact(this.address, this.phone); // Constructor
}
@jsonSerializable
class Employee {
  @JsonProperty(name: 'employeeName')
  String name;
  String email;
  Contact contact;
  Employee(this.name, this.email, this.contact); // Constructor
}
void main() {
  // Empty
}
model_file2.dart : Contenir la classe Company, avec des règles pour la convertir en structures JSON et vice versa.
lib/src/model_file2.dart
import 'package:dart_json_mapper/dart_json_mapper.dart'
    show JsonMapper, jsonSerializable, JsonProperty;

import 'model_file1.dart';

@jsonSerializable
class Company {
  @JsonProperty(name: 'companyName')
  String name;
  Contact contact;
  Company(this.name, this.contact); // Constructor
}
void main() {
  // Empty
}
Ouvrir une fenêtre Terminal sur l'IDE :
  • View > Terminal (Visual Studio Code)
  • View > Tool Windows > Terminal (Android Studio)
Exécuter l'une des deux commandes ci-dessous (selon que votre projet est Dart ou Flutter) :
dart pub run build_runner build --delete-conflicting-outputs

flutter pub run build_runner build --delete-conflicting-outputs
En conséquence, 2 fichiers seront créés. Exécuter à nouveau la commande ci-dessus si vous modifiez le code source sur les fichiers de model.
Créer un exemple "bin/test_ex1.dart", qui vous montre comment convertir un objet Dart en texte JSON :
bin/test_ex1.dart
import 'package:dart_json_mapper/dart_json_mapper.dart'
    show JsonMapper, jsonSerializable, JsonProperty;

// 'dart_json_mapper_tutorial' : Your project name.
import 'package:dart_json_mapper_tutorial/src/model_file1.dart';
import 'package:dart_json_mapper_tutorial/src/model_file2.dart';

import 'package:dart_json_mapper_tutorial/src/model_file1.mapper.g.dart'
    as modelFile1;
import 'package:dart_json_mapper_tutorial/src/model_file2.mapper.g.dart'
    as modelFile2;

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

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

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

  modelFile2.initializeJsonMapper();
  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"
 }
}
Ci-dessous un exemple qui convertit un texte JSON en objet Dart :
bin/test_ex2.dart
import 'package:dart_json_mapper/dart_json_mapper.dart'
    show JsonMapper, jsonSerializable, JsonProperty;

// 'dart_json_mapper_tutorial' : Your project name.
import 'package:dart_json_mapper_tutorial/src/model_file1.dart';
import 'package:dart_json_mapper_tutorial/src/model_file2.dart';

import 'package:dart_json_mapper_tutorial/src/model_file1.mapper.g.dart'
    as modelFile1;
import 'package:dart_json_mapper_tutorial/src/model_file2.mapper.g.dart'
    as modelFile2;

void main() {
  var jsonString1 = '''{
      "employeeName": "John Smith",
      "email": "john@example.com",
      "contact": {
        "address": "Address 1",
        "phone": "12345"
        }
      }''';
  modelFile1.initializeJsonMapper();
  // May be null:
  var employee = JsonMapper.fromJson<Employee>(jsonString1);
  print('Employee Phone: ${employee!.contact.phone}');

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

  modelFile2.initializeJsonMapper();
  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