Разбор вложенных массивов с нулем - PullRequest
1 голос
/ 27 марта 2020

Когда я скручиваю API и получаю следующие данные (примерные данные):

[
  {
    "identifier": "IdNum",
    "name": "TopCatA",
    "subCategories": [
      {
        "categoryId": "19232",
        "identifier": "83434",
        "name": "Mens",
        "sequence": 10,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "PrimaryHoverImage": "model1",
          "categoryLabel": "Mens Clothing & Accessories",
          "viewall": "false"
        },
        "subCategories": [
          {
            "categoryId": "23423423",
            "identifier": "456456456",
            "name": "Shirts",
            "categoryImage": "gfhhfghfg",
            "sequence": 1,
            "attributes": {
              "CategoryGroupType": "features",
              "PrimaryFaceOutImage": "false",
              "viewall": "false"
            }
          },
          {
            "categoryId": "3423423",
            "identifier": "234234234234",
            "name": "Jeans",
            "categoryImage": "sdfadsf-sdfas-asdf-sdfasdf"
          }
        ]
      },
      {
        "categoryId": "234234234",
        "identifier": "45345",
        "name": "Womens",
        "sequence": 12,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "PrimaryHoverImage": "model1",
          "categoryLabel": "Womens Clothing & Accessories",
          "viewall": "false"
        },
        "subCategories": [
          {
            "categoryId": "23423423",
            "identifier": "456456456",
            "name": "Shirts",
            "categoryImage": "gfhhfghfg",
            "sequence": 1,
            "attributes": {
              "CategoryGroupType": "features",
              "PrimaryFaceOutImage": "false",
              "viewall": "false"
            }
          },
          {
            "categoryId": "3423423",
            "identifier": "234234234234",
            "name": "Jeans",
            "categoryImage": "sdfadsf-sdfas-asdf-sdfasdf"
          }
        ]
      },
      {
        "categoryId": "23423423",
        "identifier": "SOME_SALE",
        "name": "Sale",
        "sequence": 23,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "PrimaryHoverImage": "model1",
          "viewall": "false"
        }
      }
    ]
  },
  {
    "identifier": "IdNum",
    "name": "TopCatB",
    "subCategories": [
      {
        "categoryId": "234234",
        "identifier": "45345",
        "name": "Boys",
        "sequence": 43,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "PrimaryHoverImage": "model1",
          "categoryLabel": "Boys Clothing & Accessories",
          "viewall": "false"
        },
        "subCategories": [
          {
            "categoryId": "23423423",
            "identifier": "456456456",
            "name": "Shirts",
            "categoryImage": "gfhhfghfg",
            "sequence": 1,
            "attributes": {
              "CategoryGroupType": "features",
              "viewall": "false"
            }
          },
          {
            "categoryId": "3423423",
            "identifier": "234234234234",
            "name": "Jeans",
            "categoryImage": "sdfadsf-sdfas-asdf-sdfasdf"
          }
        ]
      },
      {
        "categoryId": "345234",
        "identifier": "345345345",
        "name": "Girls",
        "sequence": 10,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "categoryLabel": "Girls Clothing & Accessories",
          "viewall": "false"
        },
        "subCategories": [
          {
            "categoryId": "23423423",
            "identifier": "456456456",
            "name": "Shirts",
            "categoryImage": "gfhhfghfg",
            "sequence": 1,
            "attributes": {
              "CategoryGroupType": "features",
              "viewall": "false"
            }
          },
          {
            "categoryId": "3423423",
            "identifier": "234234234234",
            "name": "Jeans",
            "categoryImage": "sdfadsf-sdfas-asdf-sdfasdf"
          }
        ]
      },
      {
        "categoryId": "23423423",
        "identifier": "SOME_SALE",
        "name": "Sale",
        "sequence": 45,
        "attributes": {
          "PrimaryFaceOutImage": "prod1",
          "categoryLabel": "Sale",
          "displaySoldOut": "true",
          "viewall": "false"
        }
      }
    ]
  }
]

Я пытаюсь применить фильтр jq, чтобы в нем остались только имена и значения всех подкатегорий. сохраняя вложенную структуру и имея ОБА TopCatA и TopCatB в конечном выводе. Проблема в том, что одна из подкатегорий (продажа) не имеет подкатегорий, как другие (мужские, женские), поэтому я получаю сообщение Cannot iterate over null (null).

Я пробовал несколько разных фильтров jq, но, похоже, не могу получить гнездо, чтобы сохранить. Конечный результат, который я ищу, - получить что-то вроде этого:

[
    {
      "identifier": "IdNum",
      "name": "TopCatA",
      "subCategories": [
        {
          "name": "Mens",
          "subCategories": [
            {
              "name": "Shirts"
            },
            {
              "name": "Jeans"
            }
          ]
        },
        {
          "name": "Womens",
          "subCategories": [
            {
              "name": "Shirts"
            },
            {
              "name": "Jeans"
            }
          ]
        },
        {
          "name": "Sale"
          "subCategories": NULL
        }
      ]
    }
  ]

Вот некоторые из jq-запросов, которые я пробовал:

cat ~/temp/testData.json | jq --tab '[.[] | {name: .name, subCat1: [.subCategories[].name], subCat2: [.subCategories[].subCategories[]?.name]} ]' <- бесполезно, так как вложение потеряно </p>

Я пытаюсь выполнить sh это только с помощью фильтров и каналов, так как я не слишком силен в выборе в jq.

1 Ответ

2 голосов
/ 27 марта 2020

Если [] вместо null вас не беспокоит:

map(.subCategories |=
  map({name, subCategories: (.subCategories // [] |
    map({name}))}))

Демо онлайн

...