JSON query

tags: json query jmespath

Иногда возникает задача распарсить JSON,и извлечь оттуда необходимую информацию. Писать код с кучей проверок,условий долго. А если структура JSON чуть поменяется,а если надо выбрать поле по какому-то условию? Прийдется править код. Облегчают жизнь в этом случае языки запросов к JSON. Например,такой как https://jmespath.org/. Предположим, нам надо вытащить количество подписчиков у therock. Идем по адресу https://www.instagram.com/therock/?__a=1 и видим json типа (оставил только кусочек json)

{
  logging_page_id: "profilePage_232192182",
  show_suggested_profiles: true,
  show_follow_dialog: false,
  graphql: {
    user: {
      biography: "founder",
      blocked_by_viewer: false,
      restricted_by_viewer: false,
      country_block: false,
      external_url: "http://www.teremana.com/",
      external_url_linkshimmed: "https://l.instagram.com/?u=http%3A%2F%2Fwww.teremana.com%2F&e=ATOFoEJbcrCRyO-hpAa-W52eSf_s01U5hWau7tlY7sRuycdAMdV9xm6pK9WlOiJzIWN_P9xjD1daJllUHoTodw&s=1",
      edge_followed_by: {
        count: 191110623
      },
      followed_by_viewer: false,
      edge_follow: {
        count: 393
      }
    }
  }
}

Фолловеры лежат в обьекте graphql > user > edge_followed_by и в свойстве count. Запрос в формате JMES path на получение подписчиков ,будет выглядеть как

graphql.user.edge_followed_by.count

т.е. в коде будет что-то типа

1
2
3
$data = json_decode($theRockJsonData);
$pathToFollowers = "graphql.user.edge_followed_by.count";
$followersCount = JmesPath\search($expression, $data);