json 只保留给定属性名称,在所有级别

envsm3lx  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(106)

在我的例子中,使用JSON格式的书签,能够清理它们并只保留有用的(一列命名的)属性(这些属性出现在结构的所有级别)是很好的。作为输出,必须保留整个JSON层次结构。
可以使用“JQ”工具吗?
到目前为止,我只能命名要删除的属性:

jq -c 'del(..| .index?,.guid?,.id?,.dateAdded?,.lastModified?,.typeCode?,.iconUri?)' in.json >out.json

需要指定要保留的属性,而不是:例如{children,type,root,title,uri}。
可以使用del()函数并以某种方式“否定”这个列表,或者在递归时使用select()吗?我尝试了一些组合,但都失败了。
请注意,“children”属性在本例中具有特殊的作用,因为它定义了JSON子树,但我希望有一种解决方案,可以将其视为其他属性。
(补充问题:是否可以将其与深度滤波结合,例如当深度> 3?)
输入JSON示例:

{
  "guid": "toolbar_____",
  "title": "toolbar",
  "type": "text/x-moz-place-container",
  "children": [
    {
      "guid": "Y-lVXPFXlF15",
      "title": "",
      "iconUri": "https://fr.wikipedia.org/static/apple-touch/wikipedia.png",
      "type": "text/x-moz-place",
      "uri": "https://fr.wikipedia.org/"
    },
    {
      "guid": "S7ow_jYLOBlX",
      "title": "tmp",
      "type": "text/x-moz-place-container",
      "children": [
        {
          "guid": "IFQ7EJXc-eNH",
          "title": "Logiciel Attentes",
          "type": "text/x-moz-place-container",
          "children": [
            {
              "guid": "l-CtLEfkIatC",
              "title": "LMMS v122",
              "iconUri": "https://lmms.io/img/logo_sm.png",
              "type": "text/x-moz-place",
              "uri": "https://lmms.io/download#collapse_linpre"
            },
            {
              "guid": "a5HfcSy3k_sT",
              "title": "Slax UEFI apres v9.11",
              "type": "text/x-moz-place",
              "uri": "https://www.slax.org/"
            }
          ]
        },
        {
          "guid": "FUt5BsHdDl2Y",
          "title": "Firewalls – MX Linux",
          "type": "text/x-moz-place",
          "uri": "https://mxlinux.org/wiki/networking/firewalls/"
        }
      ]
    }
  ]
}

预期输出:

{
  "title": "toolbar",
  "type": "text/x-moz-place-container",
  "children": [
    {
      "title": "",
      "type": "text/x-moz-place",
      "uri": "https://fr.wikipedia.org/"
    },
    {
      "title": "tmp",
      "type": "text/x-moz-place-container",
      "children": [
        {
          "title": "Logiciel Attentes",
          "type": "text/x-moz-place-container",
          "children": [
            {
              "title": "LMMS v122",
              "type": "text/x-moz-place",
              "uri": "https://lmms.io/download#collapse_linpre"
            },
            {
              "title": "Slax UEFI apres v9.11",
              "type": "text/x-moz-place",
              "uri": "https://www.slax.org/"
            }
          ]
        },
        {
          "title": "Firewalls – MX Linux",
          "type": "text/x-moz-place",
          "uri": "https://mxlinux.org/wiki/networking/firewalls/"
        }
      ]
    }
  ]
}
8ehkhllq

8ehkhllq1#

您可以通过结构walk,并通过使用with_entries更新所有objects,以临时将它们转换为键值对数组,并筛选具有匹配键的条目(即select它是否它的.keyIN一个给定的肯定列表)。

walk(objects |= with_entries(select(IN(.key;
  "children", "type", "root", "title", "uri"
))))

Demo
附加问题:是否可以将其与深度滤波相结合,例如当深度>3
您可以仅将上述应用于您所需深度的那些:

.[]?[]?[]? |= walk(…)

相关问题