在交替对象类型上运行jq查询

时间:2019-02-13 16:13:50

标签: jq

我有一个json文件,其中包含有关图像文件的大量数据。它具有以下结构:

[
  {
    "id": 1,
    "graphic": "filename",
    "export_params": {
      "uses": [
        "string"
      ]
    }
  },
  {
    "id": 2,
    "graphic": "filename2",
    "export_params": []
  },
  ...
]

此数组中的大多数对象都有完整的export_params信息,但有时它只是空数组。我已经尝试过使用这个jq查询

.[] | [.id, .graphic, .export_params.uses[], .export_params.export_type ] | @csv

将其转换为csv,但是它中断了一行,在那找到了第一个“空export_params”键。我该如何绕过不同对象类型的问题(大多数情况下是对象,如果为空,则为数组-我认为这是导致查询失败的原因)?

1 个答案:

答案 0 :(得分:1)

这个问题的简单部分是处理空数组和缺少“ export_type”值,例如

.[]
| [.id,
   .graphic,
   (.export_params.uses?[] // ""),
   (.export_params.export_type? // "") ]
| @csv

但是如果.uses是其中包含多个项目的数组怎么办?这可能意味着数量可变的值 在行中,这可能会导致问题。

要只考虑.uses中的第一项,可以使用first

.[]
| [.id,
   .graphic,
   first(.export_params.uses?[] // ""), 
   (.export_params.export_type? // "") ]
| @csv

替代方法

为避免混乱,最好在查询对象之前先对其进行调整,例如遵循以下原则:

.[]
| .export_params |= (if . == [] then {uses: [""]} else . end)
| [.id, 
   .graphic,
   .export_params.uses[0], 
   .export_params.export_type ]
| @csv