json 在JQ中获取或默认函数?

p1iqtdky  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(155)

假设有一个json文件:

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

我想使用jq来获取每列的值"required"字段。如果字段"required"不存在,它应该返回默认值false
具体而言:

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

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

b0zn9rqh

b0zn9rqh1#

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

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

有关故障安全的一般适用方法,请参见peak's answer

djmepvbi

djmepvbi2#

如果字段“required”不存在,则应返回默认值false。
要按字面意义实现该功能,应使用has/1而不是//,例如:

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

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

获取或默认值/2

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

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

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

通用getOrDefault/2

# $key can be a string or a non-empty array-path
def getOrDefault($key; $default):
  if $key | type == "string"
  then if has($key) then .[$key] else $default end
  elif $key | length == 1 then getOrDefault($key[0]; $default)
  else ($key|first) as $kf
  | if has($kf) 
    then try (.[$kf] | getOrDefault($key[1:]; $default)) catch $default
    else $default
    end
  end;

相关问题