使用JQ

时间:2016-07-12 17:53:24

标签: json 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" )

"存在"部分是完全错误的,JQ打印"元素"和"真"而不是原始的密钥名称和值。

对于"不存在"部分,JQ打印" NA"很好,但"元素"而不是原始的密钥名称。

我正在使用JQ 1.3。

2 个答案:

答案 0 :(得分:1)

这是写你"存在"的正确方法。定义:

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

已经使用jq 1.3进行了测试,但请尝试升级到更新的版本。

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

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

答案 1 :(得分:0)

这是另一个使用update assignment |=

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