【问题标题】:JQ: Remove json objects from arrayJQ:从数组中删除 json 对象
【发布时间】:2021-09-28 12:58:24
【问题描述】:

我有这个 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"
        }
      }
    }
  ]
}

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

  • entries.sys.id
  • entries.sys.contentType.sys.id
  • entry.fields

我想出了:

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 节点保留在 outfile 中?

感谢您的帮助。

【问题讨论】:

    标签: arrays json object jq


    【解决方案1】:

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

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

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

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

    .entries |= map({ "sys": { "id": .sys.id }, "contentType": { "sys": { "id": .sys.contentType.sys.id } }, fields })
    
    Try it online!

    【讨论】:

    • 非常感谢。我能够调整您的选择器以满足我的需要:entries |= map({ "sys": { "id": .sys.id, "contentType": { "sys": { "id": .sys.contentType.sys.id }}}, fields }) | del(.assets, .tags)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多