以前没有使用过jq
,但是我想构建一个将获取JSON响应并仅提取值的shell脚本。为了学习,我认为我会尝试使用博客的WP API,但是由于某种原因,我遇到了以下错误:
jq:错误(处:322):无法索引字符串为“ slug”的数组
在研究和测试先前的问题时:
jq
in a shell pipeline? 以上我尝试编写的代码:
URL="http://foobar.com"
RESPONSE=$(curl -so /dev/null -w "%{http_code}" $URL)
WPAPI="/wp-json/wp/v2"
IDENTIFIER="categories"
if (("$RESPONSE" == 200)); then
curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | jq '.' >> $IDENTIFIER.json
result=$(jq .slug $IDENTIFIER.json)
echo $result
else
echo "Not returned status 200";
fi
尝试在jq
之后更改curl
:
curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | jq '.' | $IDENTIFIER.json
result=(jq -r '.slug' $IDENTIFIER.json)
echo $result
我可以使用python JSON工具修改解压缩:
result=(curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | python -m json.tool > $IDENTIFIER.json)
我可以将JSON保存到文件中,但是当我使用jq
时,我不能仅仅获得弹头,这是我的其他尝试:
catCalled=$(curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | python -m json.tool | ./jq -r '.slug')
echo $catCalled
我的最终目标是尝试在外壳程序脚本中使用jq
并使用jq
构建一个slug数组。我在jq
中做错什么,可以在不创建文件的情况下在字符串上使用jq
吗?
解压缩每个评论请求后,从curl
返回:
[
{
"id": 4,
"count": 18,
"description": "",
"link": "http://foobar.com/category/foo/",
"name": "Foo",
"slug": "foo",
"taxonomy": "category",
},
{
"id": 8,
"count": 9,
"description": "",
"link": "http://foobar.com/category/bar/",
"name": "Bar",
"slug": "bar",
"taxonomy": "category",
},
{
"id": 5,
"count": 1,
"description": "",
"link": "http://foobar.com/category/mon/",
"name": "Mon",
"slug": "mon",
"taxonomy": "category",
},
{
"id": 11,
"count": 8,
"description": "",
"link": "http://foobar.com/category/fort/",
"name": "Fort",
"slug": "fort",
"taxonomy": "category",
}
]
最终我的目标是尝试将子弹的名称放入一个数组,如:
catArray=('foo','bar','mon', 'fort')
答案 0 :(得分:2)
这里有2个问题:
slug
不是示例json中的根级元素。根级元素是一个数组。如果要访问数组每个元素的slug
属性,可以这样进行:
jq '.[].slug' $IDENTIFIER.json
您的示例json在每个数组元素的最后一个属性之后具有尾随逗号。删除"taxonomy": "category"
之后的逗号。
如果我使用示例json,请删除错误的逗号,将其保存到名为test.json
的纯文本文件中,然后运行以下命令:
jq '.[].slug' test.json
我得到以下输出:
"foo"
"bar"
"mon"
"fort"
答案 1 :(得分:0)
不幸的是,显示为curl产生的类似JSON的数据并非严格意义上的JSON。 jq没有“宽松的JSON”模式,因此要使用jq,您必须预处理类似JSON的数据,例如使用hjson(请参见http://hjson.org/):
$ hjson -j input.qjson > input.json
在input.json中使用JSON:
$ jq -c 'map(.slug)' input.json
["foo","bar","mon","fort"]
答案 2 :(得分:0)
您的字符串不是json,请注意对象的最后一个成员如何以逗号结尾
{foo:"bar",baz:9,}
这在javascript中是合法的,但在json中是非法的。如果您应该从该端点接收json,请联系其背后的人员并告诉他们修复错误(通过用逗号结尾对象的最后一个成员来破坏json规范,这在json中是非法的)-直到修复,我想您可以使用一些正则表达式对其进行修补,但这是一个肮脏的快速修复,并且可能不是很可靠,但是可以通过
运行 perl -p -0777 -e 's/\"\,\s*}/\"}/g;'
使其成为合法的json。.