在 JQ 中获取或默认函数?

Yun*_*ang 12 json jq

假设有一个json文件:

{
  "columns": {
    "id": {
      "required": true,
      "type": "integer"
    },
    "name": {
      "required": false,
      "type": "string"
    },
    "description": {
      "type": "string"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用来jq获取每列的值“必填”字段。如果“必填”字段不存在,则应返回默认值false

具体来说:

jq '.columns.id | getOrDefault("required", false)'  # true
jq '.columns.name | getOrDefault("required", false)'  # false
jq '.columns.description | getOrDefault("required", false)'  # false
Run Code Online (Sandbox Code Playgroud)

如何在 中实现这个神奇的 getOrDefault() 函数jq

ogu*_*ail 20

在这种特殊情况下,您可以使用替代运算符 ( //)

$ jq '.columns.description | .required // false' file
false
Run Code Online (Sandbox Code Playgroud)

有关故障安全、普遍适用的方法,请参阅peak 的回答


pea*_*eak 12

如果“必填”字段不存在,则应返回默认值 false。

要从字面上实现该功能,您将使用has/1而不是//,例如:

   .columns.id
   | if has("required") then .required else false end
Run Code Online (Sandbox Code Playgroud)

如果已知 .required 字段永远不会被指定为null,那么这两种技术(使用has如上和使用// false)是等效的。

获取或默认值/2

您几乎肯定不会定义这样的函数,但是既然您问:

def getOrDefault($key; $default):
  if has($key) then .[$key] else $default end;
Run Code Online (Sandbox Code Playgroud)

(注意:jq 中的参数分隔符是;。)

  • +1 第一个公式是我正确实现“true”作为默认值所需的公式。相反,替代运算符“(//)”会使用默认值覆盖“null”和“false”值(这会在对象中遇到“false”值时错误地生成“true”值)。 (3认同)
  • 对于这个解决方案+1,原因是 @dafinguzman 给出了有关“false”值(我实际上想要的)的原因。但是,我不希望为“null”值返回“null”字符串,因此我添加了一个“null”值检查:“if has($key) and (.[$key] != null) then .[$” key] else $default end` (2认同)