【问题标题】:Get or default function in JQ?JQ中的获取或默认函数?
【发布时间】:2019-06-12 05:23:47
【问题描述】:

假设有一个json文件:

{
  "columns": {
    "id": {
      "required": true,
      "type": "integer"
    },
    "name": {
      "required": false,
      "type": "string"
    },
    "description": {
      "type": "string"
    }
  }
}

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

具体来说:

jq '.columns.id | getOrDefault("required", false)'  # true
jq '.columns.name | getOrDefault("required", false)'  # false
jq '.columns.description | getOrDefault("required", false)'  # false

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

【问题讨论】:

    标签: json jq


    【解决方案1】:

    在这种特殊情况下,您可以使用alternative operator (//)

    $ jq '.columns.description | .required // false' file
    false
    

    有关故障安全、普遍适用的方法,请参阅peak's answer

    【讨论】:

      【解决方案2】:

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

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

         .columns.id
         | if has("required") then .required else false end
      

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

      getOrDefault/2

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

      def getOrDefault($key; $default):
        if has($key) then .[$key] else $default end;
      

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

      【讨论】:

      • +1 第一个公式是我正确实现true 作为默认值所需要的。相比之下,替代运算符(//) 将使用默认值覆盖nullfalse 值(这会在对象中遇到false 值时错误地生成true 值)。
      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多