【问题标题】:Why is my jq failing on my JSON?为什么我的 jq 在我的 JSON 上失败了?
【发布时间】:2018-12-22 10:36:59
【问题描述】:

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

jq: 错误 (at :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

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 吗?


根据评论请求解压缩后从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')

【问题讨论】:

  • 你能发布服务器响应吗?
  • @hnicke 添加了 JSON 示例。

标签: json bash curl jq wp-api


【解决方案1】:

您的字符串不是 json,请注意对象的最后一个成员如何以逗号结尾,

{foo:"bar",baz:9,}

这在 javascript 中是合法的,但在 json 中是非法的。如果您应该从该端点接收 json,则联系其背后的人并告诉他们修复错误(它通过用逗号结束对象的最后一个成员来破坏 json 规范,这在 json 中是非法的。) - 直到它修复了,我想你可以用一点正则表达式来修补它,但它是一个肮脏的快速修复,可能不是很可靠,但通过运行它

perl -p -0777 -e 's/\"\,\s*}/\"}/g;' 使其合法 json..

【讨论】:

    【解决方案2】:

    预处理

    不幸的是,显示为由 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"]
    

    【讨论】:

      【解决方案3】:

      这里有两个问题:

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

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

      如果我获取您的示例 json,请删除错误的逗号,将其保存到名为 test.json 的纯文本文件中,然后运行以下命令:

      jq '.[].slug' test.json
      

      我得到以下输出:

      "foo"
      "bar"
      "mon"
      "fort"
      

      【讨论】:

      • 感谢 '.[].slug' 是我所需要的,为此 +1。
      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多