为什么我的 jq 在 JSON 上失败了?
Why is my jq failing on my JSON?
之前没有使用过 jq
,但我想构建一个 shell 脚本,它将获得 JSON 响应并仅提取值。为了学习,我想我会在我的博客的 WP API 上尝试,但由于某种原因,我收到以下错误:
jq: error (at :322): Cannot index array with string "slug"
在研究和测试以前的问题时:
以上阅读我已经尝试编码:
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
在 curl
之后更改 jq
的额外尝试:
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
时,我无法只获取 slug,这是我的其他尝试:
catCalled=$(curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | python -m json.tool | ./jq -r '.slug')
echo $catCalled
我的最终目标是尝试在 shell 脚本中使用 jq
并使用 jq
构建一个 slug 数组。我在 jq
中做错了什么,我可以在不创建文件的情况下在字符串上使用 jq
吗?
Return 来自 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",
}
]
最终我的目标是尝试将 slug 的名称放入数组中,例如:
catArray=('foo','bar','mon', 'fort')
这里有 2 个问题:
slug
在您的示例 json 中不是根级别元素。根级元素是一个数组。如果你想访问数组每个元素的slug
属性,你可以这样做:
jq '.[].slug' $IDENTIFIER.json
您的示例 json 在每个数组元素的最后一个 属性 之后有尾随逗号。 "taxonomy": "category"
.
后去掉逗号
如果我拿你的样本 json,删除错误的逗号,将其保存到一个名为 test.json
和 运行 的纯文本文件中,执行以下命令:
jq '.[].slug' test.json
我得到以下输出:
"foo"
"bar"
"mon"
"fort"
预处理
不幸的是,显示为由 curl 生成的 JSON 类数据严格来说并不是 JSON。 jq 没有 "relaxed JSON" 模式,因此为了使用 jq,您必须预处理 JSON 类数据,例如使用 hjson(参见 http://hjson.org/):
$ hjson -j input.qjson > input.json
jq
与 input.json 中的 JSON:
$ jq -c 'map(.slug)' input.json
["foo","bar","mon","fort"]
您的字符串不是 json,请注意对象的最后一个成员如何以逗号结尾,
{foo:"bar",baz:9,}
这在 javascript 中是合法的,但在 json 中是非法的。如果你应该从那个端点接收 json,然后联系它背后的人并告诉他们修复这个错误(它通过结束对象的最后一个成员用逗号打破 json 规范,这是在 json.) 中是非法的 - 在它被修复之前,我想你可以用一点正则表达式来修补它,但它是一个肮脏的快速修复,可能不是很可靠,但是 运行 它通过
perl -p -0777 -e 's/\"\,\s*}/\"}/g;'
使其合法 json..
之前没有使用过 jq
,但我想构建一个 shell 脚本,它将获得 JSON 响应并仅提取值。为了学习,我想我会在我的博客的 WP API 上尝试,但由于某种原因,我收到以下错误:
jq: error (at :322): Cannot index array with string "slug"
在研究和测试以前的问题时:
以上阅读我已经尝试编码:
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
在 curl
之后更改 jq
的额外尝试:
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
时,我无法只获取 slug,这是我的其他尝试:
catCalled=$(curl -s {$URL$WPAPI"/"$IDENTIFIER"/"} | python -m json.tool | ./jq -r '.slug')
echo $catCalled
我的最终目标是尝试在 shell 脚本中使用 jq
并使用 jq
构建一个 slug 数组。我在 jq
中做错了什么,我可以在不创建文件的情况下在字符串上使用 jq
吗?
Return 来自 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",
}
]
最终我的目标是尝试将 slug 的名称放入数组中,例如:
catArray=('foo','bar','mon', 'fort')
这里有 2 个问题:
slug
在您的示例 json 中不是根级别元素。根级元素是一个数组。如果你想访问数组每个元素的slug
属性,你可以这样做:jq '.[].slug' $IDENTIFIER.json
您的示例 json 在每个数组元素的最后一个 属性 之后有尾随逗号。
"taxonomy": "category"
. 后去掉逗号
如果我拿你的样本 json,删除错误的逗号,将其保存到一个名为 test.json
和 运行 的纯文本文件中,执行以下命令:
jq '.[].slug' test.json
我得到以下输出:
"foo"
"bar"
"mon"
"fort"
预处理
不幸的是,显示为由 curl 生成的 JSON 类数据严格来说并不是 JSON。 jq 没有 "relaxed JSON" 模式,因此为了使用 jq,您必须预处理 JSON 类数据,例如使用 hjson(参见 http://hjson.org/):
$ hjson -j input.qjson > input.json
jq
与 input.json 中的 JSON:
$ jq -c 'map(.slug)' input.json
["foo","bar","mon","fort"]
您的字符串不是 json,请注意对象的最后一个成员如何以逗号结尾,
{foo:"bar",baz:9,}
这在 javascript 中是合法的,但在 json 中是非法的。如果你应该从那个端点接收 json,然后联系它背后的人并告诉他们修复这个错误(它通过结束对象的最后一个成员用逗号打破 json 规范,这是在 json.) 中是非法的 - 在它被修复之前,我想你可以用一点正则表达式来修补它,但它是一个肮脏的快速修复,可能不是很可靠,但是 运行 它通过
perl -p -0777 -e 's/\"\,\s*}/\"}/g;'
使其合法 json..