我有以下形式的JSON数据:
{
"home": [{
"pageid": "about yft",
"pageData": "0908782"
},
{
"pageData": "09897"
}]}
如何获取home->pageid
项目的总数?
这是我到目前为止所尝试的内容:
$curFileName ={{Path_of_json_file.json}}
appName0=$(cat $curFileName | jq -c '.["home"][]["pageid"]' | sed 's/"//g');
${#appName0[@]} # to get the length of pageid but didn't success..
但它并没有带来预期的结果。
答案 0 :(得分:2)
将pageid
类型的"string"
项收集到一个数组中,然后返回数组的长度:
n=$(jq '[.home[].pageid | select(type == "string")] | length' < file.json)
或者,检查home
数组中的项目是否有pageid
。如果该项具有该属性,请将1
放入结果数组中,否则将其置为零。最后使用add
函数:
n=$(jq '[.home[] | if has("pageid") then 1 else 0 end] | add' < file.json)
以下是打印数字的方法:
printf '%d\n' "$n"
示例输出
3
答案 1 :(得分:2)
OP最初给出的输入无效,也没有包含没有.pageid的对象。在此响应中,将使用以下JSON:
{
"home": [
{
"pageid": "about yft",
"pageData": "0908782"
},
{
"pageData": "09897"
}
]
}
现在考虑这两个过滤器,两者都为上述JSON产生1:
[.home[] | select(has("pageid")) ] | length
[.home[] | .pageid//empty ] | length
如果.home很大,那么更有效的方法如下:
def count(s): reduce s as $i(0; .+1);
count(.home[] | select(has("pageid")))
这是一个高效的单行变体:
reduce (.home[].pageid?//empty) as $x (0; .+1)
要获取不同 home->pageid
项的数量,最简单的方法是使用unique|length
而不是length
,例如在上面的前两个解决方案中的任何一个。
答案 2 :(得分:-2)
在进行大量搜索后,获得下面给出的最佳结果
echo `cat $curFileName | jq '.["home"][]["pageid"]' | wc -l `
在哪里:
$curFileName
= {{Path_of_json_file.json}} .["home"][]["pageid"]
=目标Json对象json_file.json:
{
"home": [
{
"pageid": "about yft",
"pageData": "0908782"
},
{
"pageData": "09897"
}
]
}
了解更多 http://www.compciv.org/recipes/cli/jq-for-parsing-json/