Skip to content

a solution for adapter layer which make use of typescript reflection mapping from pure server-returned json to target typescript model

License

Notifications You must be signed in to change notification settings

aquicore/json-typescript-mapper

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

json-typescript-mapper

Build Status

(De)serialize between JSON and JavaScript objects using the decorators design proposal.

Installation

npm install dhkatz/json-typescript-mapper

Usage

import {deserialize} from 'json-typescript-mapper';

deserialize(<Class Type>, <JSON Object>);
serialize(<Object>);

Example

Here is a complex example, hopefully could give you an idea of how to use it (for more on how to use, checkout [/test] which are unit test cases).

Note that initializing the class properties to defaults (such as undefined) is necessary because of how TypeScript compilation works.

Properties that are not initialized are not listed as actual class keys in the JavaScript output.

class Student {
    @JsonProperty('name')
    public fullName:string;

    public constructor() {
        this.fullName = undefined;
    }
}

class Address {
    @JsonProperty('first-line')
    public firstLine:string;

    @JsonProperty('second-line')
    public secondLine:string;

    @JsonProperty({clazz: Student})
    public student:Student;

    public city:string;

    public constructor() {
        this.firstLine = undefined;
        this.secondLine = undefined;
        this.city = undefined;
        this.student = undefined
    }
}

class Person {
    @JsonProperty('Name')
    public name:string;

    @JsonProperty('xing')
    public surname:string;

    public age:number;

    @JsonProperty({clazz: Address, name: 'AddressArr'})
    public addressArr:Address[];

    @JsonProperty({clazz: Address, name: 'Address'})
    public address:Address;

    public constructor() {
        this.name = undefined;
        this.surname = undefined;
        this.age = undefined;
        this.addressArr = undefined;
        this.address = undefined;
    }
}

Now here is what API server return, assume it is already parsed to JSON object.

const json = {
  "Name": "Mark",
  "xing": "Galea",
  "age": 30,
  "AddressArr": [
      {
          "first-line": "Some where",
          "second-line": "Over Here",
          "city": "In This City",
          "student": {
              "name": "Ailun"
          }
      },
      {
          "first-line": "Some where",
          "second-line": "Over Here",
          "city": "In This City",
          "student": {
              "name": "Ailun"
          }
      }
  ],
  "Address": {
      "first-line": "Some where",
      "second-line": "Over Here",
      "city": "In This City",
      "student": {
          "name": "Ailun"
      }
  }

Simply, just map it use following code. The mapping is based on <@JsonProperty> decorator meta data.

const person: Person = deserialize(Person, json);

If you want to reverse the action, from the other way round:

const json = serialize(person);

Notice

Remember to add: experimentalDecorators and emitDecoratorMetadata in your tsconfig.json. This is essential to enable decorator support for your typescript program. Example shown as followings:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

About

a solution for adapter layer which make use of typescript reflection mapping from pure server-returned json to target typescript model

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 100.0%