Когда в последний раз вам приходилось превращать API-ответ в нужный формат для фронта? Если вы, как и я, устали писать вручную правила для каждого поля, возможно, стоит попробовать другой подход — маппинг по примеру. Именно такой инструмент сделал Joe Andersen на чистом JS.
Проблема: ручной маппинг — это error-prone
Типичный сценарий: бекенд присылает users[].posts[].title, а фронту нужно data.articles[*].headline. Классическое решение — написать трансформер вручную:
const transform = (input) => ({
data: {
articles: input.users.map(user =>
user.posts.map(post => ({
headline: post.title
}))
).flat()
}
});
Проблемы такого подхода:
- Хрупкость: изменение структуры API ломает логику
- Boilerplate: дублирование кода для похожих преобразований
- Cognitive load: приходится держать в голове две структуры одновременно
Как работает маппинг по примеру
Идея проста: вы даёте инструменту два JSON — исходный и целевой (пример того, что хотите получить). Алгоритм сам выводит правила преобразования. В случае с JSON Mapper это происходит прямо в браузере, без серверной части.
Пример из реального кейса:
// Source
{
"users": [
{
"posts": [{"title": "Hello World"}]
}
]
}
// Target example
{
"data": {
"articles": [{"headline": "Hello World"}]
}
}
Инструмент понимает, что users[0].posts[0].title соответствует data.articles[0].headline и генерирует правило для маппинга массивов через wildcards.
Под капотом: рекурсия и pattern matching
Автор реализовал несколько ключевых механизмов:
- Рекурсивный обход структур — алгоритм сравнивает объекты и массивы на всех уровнях вложенности
- Wildcard-логика — символы
[]и[*]обрабатываются как универсальные селекторы для массивов - Кеширование путей — чтобы не вычислять одни и те же преобразования многократно
Важный момент — решение работает именно с примерами данных, а не с описанием схем. Это ближе к тому, как думает разработчик: “я знаю, какой input и какой output мне нужен”.
Когда это полезно (а когда нет)
Хорошие сценарии:
- Прототипирование API-клиентов
- Быстрое адаптирование к изменениям в API
- Подготовка данных для тестовых стендов
Ограничения:
- Сложные трансформации (агрегация, вычисляемые поля) всё равно требуют кода
- Нет валидации схем — только структурный маппинг
- Большие (>10MB) JSON могут тормозить в браузере
Альтернативы и когда их выбирать
В production-среде я бы рассмотрел:
- jq — для CLI-преобразований
- JSONata — когда нужна полноценная query language
- Custom transformers — если важны производительность и типобезопасность
Но для быстрых экспериментов и ad-hoc задач клиентское решение — это именно тот low-overhead вариант, который можно держать в закладках.
Финал: стоит ли пробовать?
Мой вердикт: инструмент занял место в моём workflow для:
- Разбора новых API — быстро получаю нужную структуру
- Демо коллегам — нагляднее, чем словесное описание маппингов
- Временных преобразований — когда писать полноценный трансформер overkill
Если вы часто работаете с JSON разных форматов, попробуйте демо и гляньте код. Как минимум, это интересный пример того, что можно сделать на чистом JS без зависимостей.
Источник: https://dev.to/joe_andersen_04505c590cb4/json-mapper-tool-2n9h