首页 > 解决方案 > 使用 null 解析嵌套数组

问题描述

当我 curl 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]} ]'<--没有用,因为嵌套丢失了

我正在尝试仅通过过滤器和管道来完成此操作,因为我在 jq 中进行选择并不是很强大。

标签: jsonjq

解决方案


如果[]不是null不打扰您:

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

在线演示


推荐阅读