繁体   English   中英

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

[英]How to get root keys and key types using jq

我们来看看这个简单的数据文件: http//data.cdc.gov/data.json

我知道如何获取根密钥名称:

jq keys_unsorted[] -r data.json

产生:

@context
@id
@type
conformsTo
describedBy
dataset

而且我知道如何获得关键类型:

jq 'map(type)' data.json

哪个产生:

[
  "string",
  "string",
  "string",
  "string",
  "string",
  "array"
]

在返回对中是否有某种方法将它组合在一起? (我真正想做的是找到第一个根级别数组的密钥名称,如果有的话)。 我可以写一个例程来弄明白,但这看起来不够优雅。

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

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

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

["@context","string"]
["@id","string"]
["@type","string"]
["conformsTo","string"]
["describedBy","string"]
["dataset","array"]    

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

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

或者噪音较小:

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

奖金问题

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

.[$key]|type

然后:

$ jq -r --arg key dataset -f query.jq data.json
array
jq 'first(path(.[] | select(type == "array"))[0])' < data.json

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

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

样本输出

"dataset"

如何确定密钥的类型(例如,我会以某种形式将“数据集”发送到jq并返回“数组”)。

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

jq '.dataset | type' < data.json

样本输出

"array"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM