jq:根据对象值条件递归删除对象的最简单方法

2024-04-08

我想用jq删除 JSON“对象”中的所有字典(我通常使用该术语来指代数组或字典)

a) 包含一个名为“delete_me”的键,并且 b) 其中键“delete_me”满足某些预定条件(空、非零、真等)

基本上,我想要实现的逻辑是:遍历输入,在每个节点上,如果该节点不是数组或对象,则保留它并继续,否则,保留它但从中删除任何属于字典的子节点条件 a) 或 b) 失败。

有什么建议么?

输入示例:

{
  "a": { "foo": "bar" },
  "b": {
    "i": {
      "A": {
        "i": [
          {
            "foo": {},
            "bar": {
              "delete_if_this_is_null": false,
              "an_array": [],
              "another_array": [
                {
                    "delete_if_this_is_null": null,
                    "foo": "bar"
                }
              ],
              "etc": ""
            },
            "foo2": "s"
          },
          {
            "foo": {
              "an_array": [
                {
                  "delete_if_this_is_null": "ok",
                  "foo":"bar",
                  "another_object": { "a":1 }
                },
                {
                  "delete_if_this_is_null": null,
                  "foo2":"bar2",
                  "another_object": { "a":1 },
                  "name": null
                }
              ],
              "an_object": {
                "delete_if_this_is_null":null,
                "foo3":"bar3"
              }
            },
            "zero": 0,
            "b": "b"
          }
        ]
      }
    }
  }
}

如果“delete_me”键是,应该产生delete_if_this_is_null且预定条件为delete_if_this_is_null == null:

{
  "a": { "foo": "bar" },
  "b": {
    "i": {
      "A": {
        "i": [
          {
            "foo": {},
            "bar": {
              "delete_if_this_is_null": false,
              "an_array": [],
              "another_array": [],
              "etc": ""
            },
            "foo2": "s"
          },
          {
            "foo": {
              "an_array": [
                {
                  "delete_if_this_is_null": "ok",
                  "foo":"bar",
                  "another_object": { "a":1 }
                }
              ]
            },
            "zero": 0,
            "b": "b"
          }
        ]
      }
    }
  }
}

UPDATE: Here's the solution: Assume the input is in a file 'input.json':
jq 'def walk(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

def mapper(f):
  if type == "array" then map(f)
  elif type == "object" then
  . as $in
  | reduce keys[] as $key
      ({};
       [$in[$key] | f ] as $value
       | if $value | length == 0 then .
         else . + {($key): $value[0]} end)
  else .
  end;

walk( mapper(select((type == "object" and .delete_if_this_is_null == null) | not)) )' < input.json

杰夫的解决方案可能会带来太多影响。例如,使用:

def data: [1,2, {"hello": {"delete_me": true, "a":3 }, "there": 4} ]; ];

杰夫的解决方案产生空(即什么也没有)。

因此,以下内容可能更接近您正在寻找的内容:

walk(if (type == "object" and .delete_me) then del(.) else . end )

For data,这产生:

[1,2,{"hello":null,"there":4}]

替代解决方案

如果有一个解决方案可以消除"hello":null在上面的例子中是必需的,那么就需要jq的map_values/1的变体。这是一种方法:

def mapper(f):
  if type == "array" then map(f)
  elif type == "object" then
  . as $in
  | reduce keys[] as $key
      ({};
       [$in[$key] | f ] as $value
       | if $value | length == 0 then . 
         else . + {($key): $value[0]} end)
  else .
  end;

data | walk( mapper(select((type == "object" and .delete_me) | not)) )

结果是:

[1,2,{"there":4}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jq:根据对象值条件递归删除对象的最简单方法 的相关文章

随机推荐

  • Emacs、Vim 和 JEdit 中哪些编辑器支持同时多个文本插入点?

    背景 JEdi t 以及其他一些文本编辑器 支持称为多个同时文本插入点 http groups csail mit edu uid projects simuledit usenix01 html 至少我在这里这么称呼它 要了解这意味着什么
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • Laravel 5 - Php artisan 语法错误

    我目前正在使用 Laravel 5 开发一个应用程序 突然工匠停止工作了 我无法对其使用单个命令 它总是返回错误 Symfony Component Debug Exception FatalErrorException syntax er
  • 什么时候值得使用数据库?

    我有一个与数据库有关的问题 以及什么时候值得深入研究 我主要是一名嵌入式工程师 但我正在使用 Qt 编写一个应用程序来与我们的控制器交互 我们正处于一个奇怪的境地 我们有足够的数据 可以实现一个数据库 大约 700 多个项目并且还在不断增长
  • EF4 审核多对多关系的更改

    我正在将审核添加到我的 EF4 模型优先 应用程序中 我可以获得有关发生更改的实体的结构属性的详细信息 我还可以看到多对多关系何时发生变化 我可以看到所涉及类型的名称以及发生的情况 添加或删除 但我真正想要的是关系更改中涉及的实体的 ID
  • 使用 scala 时 lambda 的 AWS 凭证不起作用

    尝试使用通过 DefaultCredentialProvider 提供的凭证时 AWS lambda 函数不起作用 我需要将凭据传递给 S3 才能运行 Code def initializeAwsCredentials AWSCredent
  • iOS Firebase - 如何从不同节点中删除具有相同密钥的子节点

    我有一个名为 以下 的裁判 在该引用下 有 2 个不同的 userId 关注同一用户 如果他们都关注的用户想要删除他们的帐户 我想从关注节点中删除他们 多位置更新似乎不正确地实现此目的 如何做呢 用户 kk8qFOIw 是正在删除其帐户的用
  • 如何追加到 R 中的现有文件而不覆盖它?

    我想写入一个文件 然后在循环中多次追加它 在 Windows 机器上 每次追加后 我想关闭连接 因为我希望该文件存入保管箱帐户 以便我可以在代码运行时在其他计算机上打开它 以检查日志文件的状态 注意 这个条件使得这个问题不同于SO上关于si
  • Dagger 2 构建 IllegalArgumentExceptioncompileDebugJavaWithJavac

    我一直在测试 Dagger 2 一切都正常 直到我做了一些重构 现在 gradle 正在抛出一个IllegalArgumentException 而且我无法弄清楚我所做的更改现在导致了错误 我没有对 gradle 文件进行任何更改 这似乎是
  • r 沿着向量搜索并计算平均值

    我的数据看起来像 require data table DT lt data table x c 19 19 19 21 21 19 19 22 22 22 y c 53 54 55 32 44 45 49 56 57 58 我想沿着 x
  • 自动将 GitHub 分支部署到 AWS Elastic Beanstalk

    说我有一个分支stable在 GitHub 上 我希望在提交时自动部署到我的 AWS EB 实例 我看过CodePipeline 这在我托管实例的区域不可用 我也看过CodeDeploy但这似乎仅适用于 EC2 的单个实例 而不适用于Ela
  • 骆驼http端点动态形成url

    我正在尝试使用的伙计们 from direct a to someUrl processor new Processor Override public void process Exchange arg0 throws Exception
  • chrome 扩展,每 x 分钟执行一次

    我只是做一个简单的 chrome 扩展 我希望我的后台页面 或部分 每 5 分钟执行一次 以获取一些数据并显示桌面通知 如果有 我该如何执行此操作 重要提示 如果您使用非持久后台脚本 Manifest V3service worker或清单
  • 使用“memcpy”复制二维数组在技术上是未定义的行为吗?

    评论中出现了一个有趣的讨论最近的这个问题 https stackoverflow com q 69329303 10871073 现在 虽然有语言C 讨论已经转向什么C 标准指定了使用以下函数访问多维数组的元素时构成未定义行为的内容std
  • 尝试开始扫描 Chromecast 设备时出错

    使用 iOS 尝试调用时出现此错误startScan的方法GCKDeviceScanner实例 有什么建议么 2014 03 27 11 03 17 814 XXX4Cast 3542 60b NSCFTimer gck setTolera
  • Xcode 11 beta 无法在以证书问题结束的设备上安装应用程序

    尝试将应用程序构建到 iOS 设备 任何设备 iPhone X XS 任何操作系统 如 12 13 beta 并获得证书颁发 想要在 ios 13 beta 操作系统支持的设备上构建应用程序并调试问题 我要在模拟器上构建应用程序 证书的自动
  • 使用反射从抽象基类访问构造函数

    我正在研究 Java 的 Reflection 我有一个抽象类Base与构造函数 abstract class Base public Base String foo do some magic 我还有一些进一步的课程延伸Base 它们不包
  • 无法在 Visual Studio Code 中调试 Azure Functions。调试器停止

    I am using http trigger Azure Function When I am running my application by pressing F5 after clicking http localhost 707
  • iOS AVCaptureSession - 如何获取/设置每秒记录的帧数?

    我是 AVCaptureSession 的新手 希望更好地了解如何使用它 因此 我设法将视频流捕获为单独的 CIImage 并将它们转换为 UIImage 现在我希望能够获取每秒捕获的帧数 并且最好能够对其进行设置 知道该怎么做吗 AVCa
  • jq:根据对象值条件递归删除对象的最简单方法

    我想用jq删除 JSON 对象 中的所有字典 我通常使用该术语来指代数组或字典 a 包含一个名为 delete me 的键 并且 b 其中键 delete me 满足某些预定条件 空 非零 真等 基本上 我想要实现的逻辑是 遍历输入 在每个