为什么我的jq无法在JSON上显示?

时间:2018-07-14 05:06:57

标签: json bash curl jq wp-api

以前没有使用过jq,但是我想构建一个将获取JSON响应并仅提取值的shell脚本。为了学习,我认为我会尝试使用博客的WP API,但是由于某种原因,我遇到了以下错误:

  

jq:错误(处:322):无法索引字符串为“ 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

尝试在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')

3 个答案:

答案 0 :(得分:2)

这里有2个问题:

  1. slug不是示例json中的根级元素。根级元素是一个数组。如果要访问数组每个元素的slug属性,可以这样进行:

    jq '.[].slug' $IDENTIFIER.json
    
  2. 您的示例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

jq

在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。.