使用 JQ 根据密钥的存在或不存在采取行动

Acting on the existence or non-existence of a key using JQ

我有一个 JSON 文件,其中包含彼此相似但不完全相同的对象。所有对象都有一个主标识符,但对象中可能存在也可能不存在其他键。

我的问题:对于对象中的给定键,如果它存在,我如何打印出该值,如果不存在,我该如何打印出类似 "NA" 的内容,无论哪种方式都打印出键的原始名称?

示例输入:

  {
      "DBInstances": [
          {
              "Identifier": 101,
              "foo": "some_value",
              "bar": 60,
              "Model": "A"
          },
          {
              "Identifier": 102,
              "foo": "some_value",
              "Model": "B"
          }
      ]
  }

期望的输出:

          {
              "Identifier": 101,
              "foo": "some_value",
              "bar": 60,
              "Model": "A"
          },
          {
              "Identifier": 102,
              "foo": "some_value",
              "bar": "NA",
              "Model": "B"
          }

我创建了一个函数(部分)适用于不存在,但根本不适用于存在:

  def exist(element):
     if (has( element ) == true)
     then { element: "true" }
     else { element: "NA" }
     end;

当我调用它时:

 exist( "bar" )

"existence" 部分是完全错误的,因为 JQ 打印了 "element" 和 "true" 而不是原来的键名和值。

对于 "non-existence" 部分,JQ 打印 "NA" 就好了,但是 "element" 而不是原来的键名。

我正在使用 JQ 1.3。

这是编写 "exist" 定义的正确方法:

def exist(element):
  if has( element )
  then { (element): .[element] }
  else { (element): "NA" }
  end;

这已通过 jq 1.3 测试,但请尝试升级到更新的版本。

在实践中,人们更可能使用这样的成语:

if has(element) then . else .[element] = "NA" end

这是另一个使用 update assignment |=

的解决方案
   .DBInstances[] | .bar |= if .==null then "NA" else . end