0.1.1 • Published 2 years ago
mapper-dto v0.1.1
mapper-dto
Библиотека для преобразования объектов, данных к заданной структуре. Реализованы два API.
- Десериализации объекта. Преобразовывает объект cо схожей структурой. При десериализации можно переименовать поля и часть полей опустить (не копировать)
- Маппинг плоского списка. Преобразовывает плоский список в объект с древовидной структурой.
Примеры использования
Десериализация
Предположим, что мы в клиенте для описания данных используем следующие интерфесы:
interface IAddress {
id: number
street: string
flat: string
}
interface IPerson {
email: string
name: string
secondName: string
address: IAddress
}
С сервера приходит следующая структура:
{
"email": "something@email.com",
"name": "Ivan",
"second-name": "Ivanov",
"address": {
"id": 1,
"street": "Lenina",
"house": "22/5"
}
}
Как видно из примера, в получаемой структуре данных есть отличия по именованию полей. С помощью API MapUtils.deserialize можно привести структуру к нужному виду. Для этого нужно создать классы, реализующие нужные интерфесы.
import {JsonProperty, Id} from "mapper-dto";
class Address implements IAddress {
@Id()
id: number
@JsonProperty('house')
flat: string
street: string
constructor(id: number, flat: string, street: string) {
this.id = id
this.flat = flat
this.street = street
}
}
class Person implements IPerson {
@Id()
email: string
name: string
@JsonProperty('second-name')
secondName: string
@JsonProperty('address') // Для не примитивных типов данных всегда добавлять декоратор JsonProperty
address: Address
constructor(email: string, name: string, secondName: string, address: Address) {
this.email = email
this.name = name
this.secondName = secondName
this.address = address
}
}
Пример применение:
import {MapUtils} from "mapper-dto";
function fun() {
const response = axios.get('something_url')
const data = MapUtils.deserialize(Person, response.data)
}
Маппинг
У нас тот же интерфейс и теже классы, но входные данные имеют следующий вид:
[
{
"email": "something@email.com",
"name": "Ivan",
"second-name": "Ivanov",
"id": 1,
"street": "Lenina",
"house": "22/5"
}
]
Для приведения этой структуры к нужному нам интерфесу досточно воспользоваться MapUtils.mapping.
Пример:
import {MapUtils} from "mapper-dto";
function fun() {
const response = axios.get('something_url')
const data = MapUtils.mapping(Person, response.data) // data будет массивом объектов с типом Person
}