(De)serialize between JSON and JavaScript objects using the decorators design proposal.
npm install @dhkatz/json-ts
import { deserialize, serialize } from '@dhkatz/json-ts';
deserialize(<type>, <json>);
serialize(<instance>);
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.
import { JsonProperty } from '@dhkatz/json-ts';
class Student {
@JsonProperty('name')
public fullName:string;
}
class Address {
@JsonProperty('first-line')
public firstLine: string;
@JsonProperty('second-line')
public secondLine: string;
@JsonProperty()
public student: Student;
public city: string;
}
class Person {
@JsonProperty('Name')
public name:string;
@JsonProperty('xing')
public surname:string;
public age:number;
@JsonProperty({ type: Address, name: 'AddressArr' })
public addressArr:Address[];
@JsonProperty({ name: 'Address' })
public address: Address;
}
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.
import { deserialize } from '@dhkatz/json-ts';
const person = deserialize(Person, json);
If you want to reverse the action, from the other way round:
import { serialize } from '@dhkatz/json-ts';
const json = serialize(person);
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
}
}