gron. grep для JSON. Разбираем JSON в консоле
Рубрика: Без рамки -> JavaScript
Метки: JavaScript | инструменты | полезности | советы
Просмотров: 3603
Читаю еженедельную рассылку с новостями из мира JavaScript и заинтересовался анонсом нового модуля - gron. Как гласит лозунг репозитория проекта: “Make JSON greppable!”. Не знаю как правильно перевести фразу на наш великий и могучий, но думаю, можно ограничится: “Сделаем JSON более пригодным для разбора”. Слово “greppable” в данном контексте образуется от “grep” - название известной консольной утилиты в Unix-like системах.
Итак, что же умеет gron и для чего он может понадобиться. Автор проекта дает четкий ответ на этот вопрос: "gron поможет вам разобраться с плохо документируемым API, возвращающими большие JSON пакеты".
Рассмотрим пару примеров с репозитория проекта. Попробуйте с помощью браузера обратиться к сервису "https://jsonplaceholder.typicode.com/users". Он вернет вам список пользователей вымышленной базы в формате JSON. Теперь поставим задачу вывести в консоле пути по которым мы поможем в коде получить названия компаний (значение свойства "name" объекта "company"). Вводим в терминале:
curl -s https://jsonplaceholder.typicode.com/users | gron | fgrep "company.name"
И в качестве ответа получаем отфильтрованный список, позволяющий сразу понять, как нам в коде получить значение определенного поля:
json[0].company.name = "Romaguera-Crona"; json[1].company.name = "Deckow-Crist"; json[2].company.name = "Romaguera-Jacobson"; json[3].company.name = "Robel-Corkery"; json[4].company.name = "Keebler LLC"; json[5].company.name = "Considine-Lockman"; json[6].company.name = "Johns Group"; json[7].company.name = "Abernathy Group"; json[8].company.name = "Yost and Sons"; json[9].company.name = "Hoeger LLC";
Здорово? Этим возможности gron не ограничиваются. Вырежем из JSON все лишнее, а оставим только объекты company с одним единственным свойством "name":
curl -s https://jsonplaceholder.typicode.com/users | gron | fgrep "company.name" | ungron
Результатом будет соответствующий массив:
[ { "company": { "name": "Romaguera-Crona" } }, { "company": { "name": "Johns Group" } }, { "company": { "name": "Abernathy Group" } }, { "company": { "name": "Yost and Sons" } }, { "company": { "name": "Hoeger LLC" } } ]
А еще gron упрощает пока результатов сравнения JSON. Смотрим как будут выглядеть различия в двух JSON ответах:
diff <(cat testdata/two.json | gron) <(cat testdata/two-b.json | gron) 10c10 < json.contact.twitter = "@FGRibreau"; --- > json.contact.twitter = "@fgribreau";
Проект заслуживаем внимания, и в некоторых случаях, gron действительно стоит держать под рукой.