首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当JSON对象内的值与指定的值(jq)匹配时,删除该对象

当JSON对象内的值与指定的值(jq)匹配时,删除该对象
EN

Stack Overflow用户
提问于 2021-07-02 02:00:34
回答 1查看 110关注 0票数 0

目标是删除JSON文件中包含在JQ脚本中指定的键/值对的整个对象。

例如,将删除path中具有/unwanted-path/的所有对象:

input.json:

代码语言:javascript
复制
[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/path-2/",
        "guide": "Guide 2"
    },
    {
        "path": "/unwanted-path/",
        "guide": "Guide 3"
    }
]

output.json:

代码语言:javascript
复制
[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/path-2/",
        "guide": "Guide 2"
    }
]

就潜在的成功方法而言,这个JQ脚本是我见过的最接近的脚本,但它的意图当然是不同的,并且不能实现目标。

代码语言:javascript
复制
jq '.[] | walk(if type == "object" then del(.path) else . end)' original.json > modified.json

有没有一种方法可以添加逻辑来指定与path一起使用的键

关键字始终是path,但我将根据几个path值进行过滤。如果有一种方法可以一次过滤多个path值,这是理想的,但不是关键的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 04:32:49

下面的代码展示了如何通过四个示例来解决任务

代码语言:javascript
复制
#!/bin/bash

FILE='
[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/unwanted-path-2/",
        "guide": "Guide 2"
    },
    {
        "path": "/path-3/",
        "guide": "Guide 3",
        "sub": [
            {
                "path": "/unwanted-path-4/",
                "guide": "Guide 4"
            },
            {
                "path": "/path-5/",
                "guide": "Guide 5"
            },
            [
                {
                    "path": "/path-6/",
                    "guide": "Guide 6"
                },
                {
                    "path": "/unwanted-path-7/",
                    "guide": "Guide 7"
                }
            ]
        ]
    }
]
'

UNWANTED='/unwanted-path-2/'
echo "example 1: keep only objects in array that does not have the unwanted path '$UNWANTED' (narrow search)"
jq --arg unwantedPath "$UNWANTED" \
   'map(select(.path != $unwantedPath))' <<< "$FILE"

UNWANTED='/unwanted-path-7/'
echo -e "\nexample 2: delete objects that have the unwanted path '$UNWANTED' exactly (deep search)"
jq --arg unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path == $unwantedPath)) ' <<< "$FILE"

UNWANTED='unwanted'
echo -e "\nexample 3: delete objects that have the unwanted path '$UNWANTED' partially (deep search)"
jq --arg unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path | index($unwantedPath) != null)) ' <<< "$FILE"

UNWANTED='["/unwanted-path-4/", "/unwanted-path-7/"]'
echo -e "\nexample 4: delete objects that have one of unwanted paths '$UNWANTED' (deep search)"
jq --argjson unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path | IN($unwantedPath[]))) ' <<< "$FILE"

输出示例1:只保留数组中没有不需要的路径‘/ unwanted path -2/’的对象(缩小搜索范围)

代码语言:javascript
复制
[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/unwanted-path-4/",
        "guide": "Guide 4"
      },
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        },
        {
          "path": "/unwanted-path-7/",
          "guide": "Guide 7"
        }
      ]
    ]
  }
]

输出示例2:删除具有不需要的路径‘/ unwanted path -7/’的对象(深度搜索)

代码语言:javascript
复制
[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/unwanted-path-2/",
    "guide": "Guide 2"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/unwanted-path-4/",
        "guide": "Guide 4"
      },
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]

输出示例3:删除部分不想要的路径' unwanted‘的对象(深度搜索)

代码语言:javascript
复制
[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]

输出示例4:删除具有不需要的路径‘“/ unwanted path-4/”,“/unwanted path-7/”’的对象(深度搜索)

代码语言:javascript
复制
[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/unwanted-path-2/",
    "guide": "Guide 2"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68214943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档