我们来看看这个简单的数据文件: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并获得"数组"作为回报)?
答案 0 :(得分:3)
编写依赖于键名和值的查询的最简单方法是使用“* _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
答案 1 :(得分:0)
jq 'first(path(.[] | select(type == "array"))[0])' < data.json
使用.[]
过滤掉顶级项目select(type == "array")
,path()
仅选择数组类型的项目; .
返回first()
中路径的数组表示,即数组项的键名; "dataset"
提取第一条路径。
因此该命令的结果是第一个顶级数组项的键名。
示例输出
.dataset
如何确定密钥的类型(例如,我会以某种形式发送&#34;数据集&#34;到jq,并得到&#34;数组&#34;作为回报)。
你可能意味着&#34;值的类型&#34;,因为键必须是JSON中的字符串。如果路径已知(例如type
),则可以使用jq '.dataset | type' < data.json
函数获取对象的类型:
"array"
示例输出
function sa(_this) {
var modalBody = document.getElementById("modalBody");
modalBody.innerHTML += "<span>"+_this.id+"</span>";
console.log(_this);
}