Publié le 08/23/2017, rédigé par Chloé MAHALIN

Typescript

Sérialiser et déserialiser un objet Typescript

Vous voulez sérialiser ou désérialiser vos entités pour les faire transiter au format JSON ? Voici comment je vous propose de procéder :

Désérialiser vers du JSON

Pour cela, gardons les classiques. Vous ne voulez pas vous embêter avec une méthode toString() un peu hasardeuse :

let jsonEntity: string = JSON.stringify(myEntity);

Sérialiser le JSON vers un objet

Si on a une entité dans ce genre :

export class Entity {
    name: string;
    age: number;
}

Vous pourriez essayer de profiter du typage relatif fourni par javascript et faire quelque chose dans ce genre :

let json: string = "{name = 'toto', age = '8'}";

let entity: Entity = json as Entity;

Bien sûr que cela fonctionne. Votre instance d'entity est un objet qui se fait passer pour un type 'Entity'. Et aussi longtemps que vos attributs dans la classe Entity sont publiques et vous n'utilisez pas les méthodes de votre entité, aucun problème.

Mais moi, je veux que mon entité soit impénétrable :

export class Entity {
    private name: string;
    private age: number;

    getName(): string { return this.name; }
    getAge(): number { return this.age; }
    setName(name: string): void { this.name = name; }
    setAge(age: number): void { this.age = age; }
}

Dans ce cas, pas le choix, il faut passer par une classe dont le travail sera de désérialiser votre objet :

import { Injectable } from '@angular/core';
import { Entity } from '../entities/entity';

/**
 * Represents an application deserializer.
 */
@Injectable()
export class EntitySerializer {

  deserialize(input: any): Entity {
    const newEntity: Entity = new Entity();

    if (this.isDefinedAndNotNull(input.name)) {
      newEntity.setName(input.name);
    }
    if (this.isDefinedAndNotNull(input.age)) {
      newEntity.getAge(input.age);
    }
    return newApplication;
  }

  isDefinedAndNotNull(input: any): boolean {
    return input != null;
  }
}

Il ne vous reste plus qu'a appeler votre Serializer:

let json: string = "{name = 'toto', age = '8'}";

EntitySerializer serializer = new EntitySerializer();

let entity: Entity = serializer.deserialize(JSON.parse(json));