Персональный блог Игоря Антонова aka "spider_net"

gron. grep для JSON. Разбираем JSON в консоле


Рубрика: Без рамки -> JavaScript
Метки: | | |
Просмотров: 3333
gron. grep для JSON. Разбираем JSON в консоле

Читаю еженедельную рассылку с новостями из мира 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 действительно стоит держать под рукой.

Оставьте комментарий!
comments powered by HyperComments