jQ - 查询替代 JSON 结构

jQ - query alternative JSON structures

我有以下 JSON-内联文档:

  {
  "a": "Person",
  "alternateName": [
     {
       "alternateName": "1793 Diébolt"
     },
     {
       "alternateName": "XXX Diébolt"
     }
  ],
  "uri": "http://500051893"
  }
  {
    "a": "Person",
    "alternateName": {
       "alternateName": "A1-53167"
     },
    "uri": "http://vocab.getty.edu/ulan/500116327"
  }

我想从所有 alternateName 键中获取值并将其输出为 TSV 文件。

我可以得到那些只有一个 alternateName-object 的:

jq -r "[ .uri, .alternateName.alternateName ] | join(\"\t\")"

但是我怎样才能同时获得:只有一个 alternateName-object 的那些和第一个 alternateName 键有一个带有 alternateName 个键的字典的那些?

您确实应该使用具有相同结构的数据。否则你将不得不处理奇怪的极端情况。 alternateName 应该是对象数组,否则,用每个 alternateName 对象复制根对象。

无论如何,这是处理不同类型的方法。使用替代运算符 (//) 以及一些过滤来处理不同的情况。您可以使用 arrays 过滤器来处理数组并在之后交替假设对象。

{ uri, alternateName: .alternateName | (arrays[].alternateName // .alternateName) }
    | "\(.uri)\t\(.alternateName)"

这是一个使用辅助函数来规范化 .alternateName 值的解决方案。

def vals:
  if (.|type) == "object" then .[] else . end
;      

"\(.uri)\t\(.alternateName[] | vals)"