如何使用 jq 获取根密钥和密钥类型

Nar*_*hal 3 json types key jq

让我们以这个简单的数据文件为例http : //data.cdc.gov/data.json

我知道如何获取根键名称:

jq keys_unsorted[] -r data.json
Run Code Online (Sandbox Code Playgroud)

它产生:

@context
@id
@type
conformsTo
describedBy
dataset
Run Code Online (Sandbox Code Playgroud)

而且我知道如何获取密钥类型:

jq 'map(type)' data.json
Run Code Online (Sandbox Code Playgroud)

其中产生:

[
  "string",
  "string",
  "string",
  "string",
  "string",
  "array"
]
Run Code Online (Sandbox Code Playgroud)

没有某种方法可以将其组合成返回对吗?(我真正想做的是找到第一个根级数组的键名,如果有的话)。我可以写一个例程来弄清楚,但这似乎不雅。

额外的问题:如何确定键的类型(例如,我会以某种形式向 jq 发送“数据集”并得到“数组”作为回报)?

pea*_*eak 8

编写依赖于键名和值的查询的最简单方法是使用“*_entries”系列过滤器之一。在你的情况下:

$ jq -c 'to_entries[] | [.key, (.value|type)]' data.json

["@context","string"]
["@id","string"]
["@type","string"]
["conformsTo","string"]
["describedBy","string"]
["dataset","array"]    
Run Code Online (Sandbox Code Playgroud)

如果您希望以更易读的方式呈现,请考虑使用@csv 或@tsv,例如

$ jq -r 'to_entries[] | [.key, (.value|type)] | @csv' data.json
"@context","string"
"@id","string"
"@type","string"
"conformsTo","string"
"describedBy","string"
"dataset","array"
Run Code Online (Sandbox Code Playgroud)

或者噪音更小:

$ jq -r 'to_entries[] | "\(.key) \(.value|type)"' data.json
@context string
@id string
@type string
conformsTo string
describedBy string
dataset array
Run Code Online (Sandbox Code Playgroud)

奖金问题

这是第二个问题的参数化方法。让文件 query.jq 包含:

.[$key]|type
Run Code Online (Sandbox Code Playgroud)

然后:

$ jq -r --arg key dataset -f query.jq data.json
array
Run Code Online (Sandbox Code Playgroud)


Rus*_*nov 3

jq 'first(path(.[] | select(type == "array"))[0])' < data.json
Run Code Online (Sandbox Code Playgroud)

顶级项目.[]被过滤掉,select(type == "array")仅选择数组类型的项目;path()返回 中路径的数组表示形式.,即数组项的键名;first()提取第一条路径。

因此该命令的结果是第一个顶级数组项的键名称。

样本输出

"dataset"
Run Code Online (Sandbox Code Playgroud)

如何确定键的类型(例如,我将以某种形式将“数据集”发送到 jq 并得到“数组”作为回报)。

您可能指的是“值的类型”,因为键必须是 JSON 中的字符串。如果路径已知(例如.dataset),则可以使用以下函数获取对象的类型type

jq '.dataset | type' < data.json
Run Code Online (Sandbox Code Playgroud)

样本输出

"array"
Run Code Online (Sandbox Code Playgroud)