json - 使用 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 中进行选择并不是很强大。
解决方案
如果[]
不是null
不打扰您:
map(.subCategories |=
map({name, subCategories: (.subCategories // [] |
map({name}))}))
推荐阅读
- javascript - dict 对象形成数据以在 VueJS 中进行补丁操作
- terraform - 如何在 terraform 中用本地后端覆盖远程后端?
- linq - 动态 Linq 核心
- c++ - 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- java - 将枚举值与类字段匹配
- javascript - MongoDB 数据库服务未启动
- ubuntu - Makefile 不会将我的输出“堆叠”在 .txt 文件中
- java - Java - 如何使用缓冲区读取器读取文件两次或使用流两次
- django - 使用脚本获取在 VM 上运行的 django 源代码目录路径
- reactjs - React 子组件在重新渲染时失去动画