【问题标题】:How to conditionally add key to json if it doesn't exist?如果它不存在,如何有条件地将密钥添加到json?
【发布时间】:2020-03-11 17:08:58
【问题描述】:

我有一个包含以下数据的 json 文件:

{
  "Index" : {
    "example_user" : {
      "important_key" : "leave_me_alone",
      "blah" : {
        "more_stuff" : {
          "ignore_this" : "and_this_too"
        }
      }
    },
    "another_user" : {
      "blah" : {
        "more_stuff" : {
          "ignore_this" : "and_this_too"
        }
      }
    },
    "extra_person" : {
      "blah" : {
        "more_stuff" : {
          "ignore_this" : "and_this_too"
        }
      }
    }
  }
}

如您所见,another_userextra_person 中缺少 important_key

我的目标是有条件地添加 "imporant_key" : "" 缺失但替换任何现有 important_key 值。我使用的程序是来自https://stedolan.github.io/jq/JQ (1.6)。

jqplay.org 上多次尝试失败并在互联网上深入(重新)搜索如何完成工作后,我才设法实现以下几点:

过滤器.Index[]+={"important_key":"data"}

结果

{
  "Index": {
    "example_user": {
      "important_key": "data",
      "blah": {
        "more_stuff": {
          "ignore_this": "and_this_too"
        }
      }
    },
    "another_user": {
      "blah": {
        "more_stuff": {
          "ignore_this": "and_this_too"
        }
      },
      "important_key": "data"
    },
    "extra_person": {
      "blah": {
        "more_stuff": {
          "ignore_this": "and_this_too"
        }
      },
      "important_key": "data"
    }
  }
}

我知道+=(覆盖)写入了任何现有的键值(注意example_user)。我一直在尝试多个piped 过滤器/运算符,包括|={ },但最后,上述结果是我能得到的最接近的结果。

(不幸的是,我似乎找不到 jqplay 代码 sn-p 我对所有东西都“疯狂”了)

【问题讨论】:

  • 以下使用JREPL.BAT 的命令行适用于本示例。 jrepl.bat "{(\s*)(\x22blah\x22)" "{$1\x22important_key\x22: \x22\x22,$1$2" /M /X /F "Example.json" /O - 尽管不使用 jq,但如果您对该解决方案感到满意,请告诉我,我可以写一个答案并解释非常简单的 JScript 正则表达式。正则表达式问题是 Stack Overflow 的主题。
  • 我知道 dbenham 出色的 JREPL 脚本(我似乎无法在此处格式化文本),但由于 json 中有数组的工作示例,我(现在)希望这可以使用JQ,一个人。不过,我感谢您的意见,这就是为什么我会赞成您的评论。与此同时,我将继续希望采用 JQ 类型的方法。

标签: json windows key jq


【解决方案1】:

当您必须有条件地做某事时,您必须进行某种过滤,使用ifselect 或其他方式。

对于您要检查的每个对象,检查该对象是否有您的important_key 并在必要时添加它。如果它有密钥,什么都不做,否则设置它。

.Index[] |= if has("important_key") then . else .important_key = $myImportantKey end

【讨论】:

  • 感谢您的贡献,杰夫·梅尔卡多。我在 cmd/batch 和 C 项目中经常使用这些语句,但 JQ (stedolan.github.io/jq) 对我来说完全不同。由于 $myImportantKey 是一个自定义变量/值,我将如何对其进行转换以使其在 jqplay.org 上可用(因此也与 JQ 一起使用)?
  • $myImportantKey 只是一些(jq)变量,它具有您希望设置的值。它不一定是一个变量,你可以在它的位置插入你想要的任何东西。这是 jqplay sn-p 中的所有内容:jqplay.org/s/eIFpsS15Ii
  • 杰夫,你做到了吗?我想我必须理解你的魔法......请给我一些时间来重新(适应/调整)我的内部运作,我会尽快回复你。
  • 如果在我的权力范围内,我会给你一个金徽章,但这会被认为是作弊,所以我会选择你的答案作为解决方案!这真的让我度过了一周:-)(仍然欢迎和赞赏额外的 JQ 答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多