代码之家  ›  专栏  ›  技术社区  ›  GʀᴜᴍᴘʏCᴀᴛ

为什么我的jq在json上失败了?

  •  2
  • GʀᴜᴍᴘʏCᴀᴛ  · 技术社区  · 6 年前

    没用过 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
    

    另一次尝试更改 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公司 在shell脚本中构建一个slug数组 JQ公司 是的。我做错什么了 JQ公司 我能用吗 JQ公司 在不创建文件的字符串上?


    返回 卷曲 按评论请求解压缩后:

    [
      {
        "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 回复  |  直到 6 年前
        1
  •  2
  •   Asaph    6 年前

    这里有两个问题:

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

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

    如果我获取您的示例json,删除错误的逗号,将其保存到名为 test.json 并运行以下命令:

    jq '.[].slug' test.json
    

    我得到以下输出:

    "foo"
    "bar"
    "mon"
    "fort"
    
        2
  •  0
  •   peak    6 年前

    预处理

    不幸的是,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
  •  0
  •   hanshenrik    6 年前

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

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

    这在javascript中是合法的,但在json中是非法的。如果您应该从那个端点接收json,那么联系它后面的人并告诉他们修复这个bug(它用逗号结束对象的最后一个成员,从而破坏了json规范,这在json中是非法的。)-在修复之前,我想您可以用一点regex来修补它,但这是一个肮脏的快速修复,可能不太可靠,但要通过

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