azerphoenix
@azerphoenix
Java Software Engineer

Как замаппить json в массив объектов?

Доброго времени суток!
Пишу небольшое приложение и необходимо замаппить json, содержащий массив объектов в массив объектов. В Java это решается через ModelMapper, MapStruct и т.д. А вот, как это реализовать в ts / js не знаю.
json приходит в ответе на post запрос сделанный через axios.
let routingRequest: RoutingRequest = new RoutingRequest(coordinates);
axios({
    method: 'post',
    url: routingUrl,
    data: routingRequest,
    headers: {
        'Content-Type': 'application/json'
    }
}).then(function (response: AxiosResponse) {
    let routes: Route[] = [];
    response.data.forEach(
        (route: any) => {
            routes.push(route as Route)
        }
    )
}).catch(function (error: AxiosError) {
    console.log(error);
});

Пример, json который приходит:
[
    {
        "instructions": [
        {
            "turnDescription": "Продолжите движение",
            "distance": 130.26291709756794,
            "time": 23447,
            "sign": 0,
            "name": "",
            "points": [
            {
                "latitude": 53.901085505509265,
                "longitude": 27.55511741648531
            },
            {
                "latitude": 53.9010582,
                "longitude": 27.5552493
            },
            {
                "latitude": 53.9013356,
                "longitude": 27.556052
            }]
        }],

        "description": [],
        "distance": 2887.358604882371,
        "ascend": 0.0,
        "descend": 0.0,
        "routeWeight": 506.1757242634384,
        "time": 304025,
        "pointsOrder": []
    }
]


Модели, которые я хочу использовать:
export class Route {

    private instructions: Instruction[];
    private description: number[];
    private distance: number;
    private ascend: number;
    private descend: number;
    private routeWeight: number;
    private time: number;
    private pointsOrder: number[];

    // constructors, getters, setters

}

export class Instruction {

    private turnDescription: string;
    private distance: number;
    private time: number;
    private sign: number;
    private name: string;
    private points: Point[];

    // constructors, getters, setters

}

export class Point {

    private latitude: number;
    private longitude: number;

    // constructors, getters, setters

}


При попытке десериализовать в массив объектов получаю либо ошибку в ветке catch e is undefined, либо просто undefined

К сожалению, не удалось найти нужную информацию в интернете
Буду рад любой помощи.
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Просто:
let routes = await axios(...)
.then((response: AxiosResponse<Route[]>) => response.data)
.catch(console.log);
Нет смысла гонять из пустого в порожнее.

Только учитывай - все проверки типов и моделей typescript делает на этапе компиляции. На этапе исполнения никакого typescript не существует, потому когда приходит ответ с сервера нет никаких гарантий что он соответствует модели, и typescript не сможет никак отловить если это не так. Если нужны какие-то проверки - их надо писать самому руками или с помощью соответствующих либ.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы