Пропускать атрибуты без массива на указанном уровне вложенности c в JSON - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь получить хосты, занесенные в черный список Firefox, из исходного списка, который он использует , чтобы я мог использовать его в другом браузере (Qutebrowser).

Я был достаточно успешно с jq для синтаксического анализа JSON.

#!/bin/sh
for term in Advertising Content Social Analytics Fingerprinting Cryptomining Disconnect; do
    jq ".categories.$term[][][][]" services.json
done

Однако несколько самых глубоких объектов (которые всегда находятся на одном уровне вложенности) некоторых категорий содержат дополнительную информацию, которая нарушает jq, например, "performance": "true" ниже:

{
  "categories": {
    ...
    "Cryptomining": [
      {
        "a.js": {
          "http://zymerget.bid": [
            "alflying.date",
            "alflying.win",
            ...
            "zymerget.faith"
          ],
          "performance": "true"
        }
      },
      {
        "CashBeet": {
          "http://cashbeet.com": [
            "cashbeet.com",
            "serv1swork.com"
          ]
        }
      },
      ...

Так, например, когда l oop приходит к jq ".categories.Cryptomining[][][][]" services.json, возникает ошибка и прекращается обработка категории:

"alflying.date"
"alflying.win"
...
"zymerget.faith"
jq: error (at servicesN.json:11167): Cannot iterate over string ("true")

Есть ли способ игнорировать эти атрибуты, не являющиеся массивами, с помощью jq? В качестве extra , пожалуйста, дайте мне знать, могу ли я отказаться от l oop и выполнить весь процесс за один jq (потому что в настоящее время, как видно выше, я перечисляю все категории в для l oop).

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Есть ли способ игнорировать эти атрибуты без массива с помощью jq?

Да, arrays встроенный .

В качестве extra , пожалуйста, дайте мне знать, могу ли я отказаться от l oop и выполнить весь процесс за один jq (поскольку в настоящее время, как видно выше, Я перечисляю все категории для l oop).

Итератор значений массива / объекта делает это за вас.

jq '.categories[][][][] | arrays[]' services.json

Но, для этой конкретной задачи, похоже, вам вообще не нужен arrays; следующая команда дает тот же результат:

jq '.categories[][][][][]?' services.json

См. .[]?.

0 голосов
/ 21 июня 2020

Учитывая

{
  "categories": {
    "Cryptomining": [
      {
        "a.js": {
          "http://zymerget.bid": [
            "alflying.date",
            "alflying.win",
            "zymerget.faith"
          ],
          "performance": "true"
        }
      },
      {
        "CashBeet": {
          "http://cashbeet.com": [
            "cashbeet.com",
            "serv1swork.com"
          ]
        }
      }
    ]
  }
}

В качестве альтернативы вложенным путям вы можете использовать рекурсивный спуск:

.. | strings

Что дает:

"alflying.date"
"alflying.win"
"zymerget.faith"
"true"
"cashbeet.com"
"serv1swork.com"

Исключить " true "либо сделать его логическим , либо исключить строки, в которых нет .:

.. | strings | select(contains("."))

Возвращает:

"alflying.date"
"alflying.win"
"zymerget.faith"
"cashbeet.com"
"serv1swork.com"
...