为什么我的 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 个问题:

  1. slug 在您的示例 json 中不是根级别元素。根级元素是一个数组。如果你想访问数组每个元素的slug 属性,你可以这样做:

    jq '.[].slug' $IDENTIFIER.json
    
  2. 您的示例 json 在每个数组元素的最后一个 属性 之后有尾随逗号。 "taxonomy": "category".

  3. 后去掉逗号

如果我拿你的样本 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..