繁体   English   中英

JQ:从数组中删除 json 个对象

[英]JQ: Remove json objects from array

我有这个 json 文件,其中包含数百个条目,我需要从不需要的数据中删除这些条目。 片段:

{
  "entries": [
    {
      "metadata": {
        "tags": [
        ]
      },
      "sys": {
        "space": {
          "sys": {
            "type": "Link",
            "linkType": "Space",
            "id": "9kn72w8zc6fh"
          }
        },
        "id": "vcLKKhJ3mZNfGMvVZZi07",
        "type": "Entry",
        "createdAt": "2021-05-20T15:14:01.358Z",
        "updatedAt": "2021-09-20T15:28:30.799Z",
        "environment": {
          "sys": {
            "id": "production",
            "type": "Link",
            "linkType": "Environment"
          }
        },
        "publishedVersion": 47,
        "publishedAt": "2021-09-20T15:28:30.799Z",
        "firstPublishedAt": "2021-05-25T10:26:56.722Z",
        "createdBy": {
          "sys": {
            "type": "Link",
            "linkType": "User",
            "id": "6F84RwUIY9cXNNXBoQemqX"
          }
        },
        "updatedBy": {
          "sys": {
            "type": "Link",
            "linkType": "User",
            "id": "6F84RwUIY9cXNNXBoQemqX"
          }
        },
        "publishedCounter": 4,
        "version": 48,
        "publishedBy": {
          "sys": {
            "type": "Link",
            "linkType": "User",
            "id": "6F84RwUIY9cXNNXBoQemqX"
          }
        },
        "contentType": {
          "sys": {
            "type": "Link",
            "linkType": "ContentType",
            "id": "page"
          }
        }
      },
      "fields": {
        "title": {
          "de-DE": "Startseite",
          "en-US": "Home"
        },
        "description": {
          "en-US": "foo"
        },
        "keywords": {
          "en-US": "bar"
        },
        "stageModules": {
          "en-US": [
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "11AfBBuNK8bx3EygAS3WTY"
              }
            }
          ]
        },
        "contentModules": {
          "en-US": [
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "7uyuyIBsXWApHqpR7Pgkac"
              }
            },
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "4HILHPLjqQkP2H1hA2FeBG"
              }
            },
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "QuwRHL3XMSkguqrL1hUzC"
              }
            },
            {
              "sys": {
                "type": "Link",
                "linkType": "Entry",
                "id": "4ZyVef5oWhQWXK9V1lr3vz"
              }
            }
          ]
        },
        "layout": {
          "en-US": "Wide"
        }
      }
    }
  ]
}

从条目数组中,我实际上只需要:

  • 条目.sys.id
  • 条目.sys.contentType.sys.id
  • 条目.字段

我想出了:

jq \
  '.entries | .[] .sys, .[] .fields | del(.createdAt, .createdBy, .environment, .firstPublishedAt, .metadata, .publishedAt, .publishedBy, .publishedCounter, .publishedVersion, .space, .type, .updatedAt, .updatedBy, .version)' \
  $infile >| $outfile

但是,这会改变文档的结构。 条目节点丢失(由于.entries filter ):

{
  "id": "vcLKKhJ3mZNfGMvVZZi07",
  "contentType": {
    "sys": {
      "type": "Link",
      "linkType": "ContentType",
      "id": "page"
    }
  }
}
{
  "id": "1UgOmHIvsWrFEf1VCa84kz",
  "contentType": {
    "sys": {
      "type": "Link",
      "linkType": "ContentType",
      "id": "moduleText"
    }
  }
}
{
  "title": {
    "de-DE": "Startseite",
    "en-US": "Home"
  },
  "description": {
    "en-US": "Foo"
  },
  "keywords": {
    "en-US": "Bar"
  },
  "stageModules": {
    "en-US": [
      {
        "sys": {
          "type": "Link",
          "linkType": "Entry",
          "id": "11AfBBuNK8bx3EygAS3WTY"
        }
      }
    ]
  },
  "contentModules": {
    "en-US": [
      {
        "sys": {
          "type": "Link",
          "linkType": "Entry",
          "id": "7uyuyIBsXWApHqpR7Pgkac"
        }
      },
      {
        "sys": {
          "type": "Link",
          "linkType": "Entry",
          "id": "4HILHPLjqQkP2H1hA2FeBG"
        }
      },
      {
        "sys": {
          "type": "Link",
          "linkType": "Entry",
          "id": "QuwRHL3XMSkguqrL1hUzC"
        }
      },
      {
        "sys": {
          "type": "Link",
          "linkType": "Entry",
          "id": "4ZyVef5oWhQWXK9V1lr3vz"
        }
      }
    ]
  },
  "layout": {
    "en-US": "Wide"
  }
}

我有两个问题:

  1. 如何删除更深的对象,例如。 .entries.sys.space.sys.linkType
  2. 如何将 .entries 节点保留在输出文件中?

感谢您的帮助。

如果您想完全控制 output,我只需重新创建所需的格式即可。

听起来您正在尝试接受以下格式:

{
  "entries": [
    {
      "sys": {
        "id": ...
      },
      "contentType": {
        "sys": {
          "id": ...
        }
      },
      "fields": ...
      }
    }
  ]
}

我们可以通过使用以下 JQ 选择器来实现:

.entries |= map({ "sys": { "id": .sys.id }, "contentType": { "sys": { "id": .sys.contentType.sys.id } }, fields })
在线试用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM