在OSX中美化curl的JSON输出

12 投票
2 回答
12055 浏览
提问于 2025-04-17 20:08

我正在尝试美化从curl获取的JSON响应,但这没成功。

Narnia:~ vitaly$ curl -s https://api.vk.com/method/photos.getAlbums?uid=6015870&access_token=0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37 | python -m json.tool
[4] 8822
No JSON object could be decoded
Narnia:~ vitaly$ {"response":[{"aid":"109967643","thumb_id":"163950716","owner_id":"6015870","title":"9 мая 2010","description":"","created":"1273613868","updated":"1273695901","size":7},{"aid":"95299056","thumb_id":"135702541","owner_id":"6015870","title":"Kemer 2009","description":"http:\/\/picasaweb.google.com.ua\/Ivanov.Vitalii\/Kemer2009","created":"1250355164","updated":"1250520619","size":72},{"aid":"43368938","thumb_id":"116630327","owner_id":"6015870","title":"Лето 2008 (Алупка)","description":"","created":"1220478168","updated":"1221348162","size":43},{"aid":"38630587","thumb_id":"116886016","owner_id":"6015870","title":"Flowers","description":"","created":"1217680400","updated":"1236774230","size":9},{"aid":"36658103","thumb_id":"163954451","owner_id":"6015870","title":"Моя ката","description":"","created":"1216419744","updated":"1273698620","size":8},{"aid":"23100962","thumb_id":"112723283","owner_id":"6015870","title":"Только пипл","description":"","created":"1208636545","updated":"1210382181","size":9},{"aid":"15473894","thumb_id":"114370266","owner_id":"6015870","title":"other","description":"","created":"1203516879","updated":"1327679223","size":29},{"aid":"15471241","thumb_id":"95266020","owner_id":"6015870","title":"Сам батя или чего нельзя в фотошопе =)","description":"","created":"1203516081","updated":"1203516728","size":4}]}
[4]   Done                    curl -s https://api.vk.com/method/photos.getAlbums?uid=6015870
Narnia:~ vitaly$ 

为什么我会收到“No JSON对象无法被解码”的错误?我请求的URL总是返回有效的JSON。如果我手动传入响应的JSON,比如用$ echo jsonreponse | python -m json.tool,这样可以美化JSON。

我是不是做错了什么?

2 个回答

5

请把你的网址用引号括起来。这个网址是错的:

curl https://api.github.com/repos/mojombo/jekyll/issues?state=closed&assignee=mojombo | python -mjson.tool

这个网址是对的:

curl 'https://api.github.com/repos/mojombo/jekyll/issues?state=closed&assignee=mojombo' | python -mjson.tool
17

你需要在你的网址周围加上引号:

curl -s "https://api.vk.com/method/photos.getAlbums?uid=6015870&access_token=0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37" | python -m json.tool

这里的 & 符号是一个特殊字符,它会把命令放到后台去执行。所以你实际上没有把完整的网址传给服务器,而是把命令 curl -s https://api.vk.com/method/photos.getAlbums?uid=6015870 放到了后台。

这就是为什么你看到终端输出 [4] 8822;你把一个第四个任务放进了任务队列,它被分配了一个进程ID(PID)8822。

剩下的命令是:

access_token=0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37 | python -m json.tool

这确实不会产生有效的JSON格式:

$ access_token=0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37 | python -m json.tool
No JSON object could be decoded

你可以在下一行看到你放到后台的任务完成:

Narnia:~ vitaly$ {"response":[{"aid":"109967643","thumb_id":"163950716","owner_id":"6015870","title":"9 мая 2010","description":"","created":"1273613868","updated":"1273695901","size":7},{"aid":"95299056","thumb_id":"135702541","owner_id":"6015870","title":"Kemer 2009","description":"http:\/\/picasaweb.google.com.ua\/Ivanov.Vitalii\/Kemer2009","created":"1250355164","updated":"1250520619","size":72},{"aid":"43368938","thumb_id":"116630327","owner_id":"6015870","title":"Лето 2008 (Алупка)","description":"","created":"1220478168","updated":"1221348162","size":43},{"aid":"38630587","thumb_id":"116886016","owner_id":"6015870","title":"Flowers","description":"","created":"1217680400","updated":"1236774230","size":9},{"aid":"36658103","thumb_id":"163954451","owner_id":"6015870","title":"Моя ката","description":"","created":"1216419744","updated":"1273698620","size":8},{"aid":"23100962","thumb_id":"112723283","owner_id":"6015870","title":"Только пипл","description":"","created":"1208636545","updated":"1210382181","size":9},{"aid":"15473894","thumb_id":"114370266","owner_id":"6015870","title":"other","description":"","created":"1203516879","updated":"1327679223","size":29},{"aid":"15471241","thumb_id":"95266020","owner_id":"6015870","title":"Сам батя или чего нельзя в фотошопе =)","description":"","created":"1203516081","updated":"1203516728","size":4}]}
[4]   Done                    curl -s https://api.vk.com/method/photos.getAlbums?uid=6015870

加上 引号后,这个命令会产生:

$ curl -s "https://api.vk.com/method/photos.getAlbums?uid=6015870&access_token=0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37" | python -m json.tool
{
    "error": {
        "error_code": 5, 
        "error_msg": "User authorization failed: access_token was given to another ip address.", 
        "request_params": [
            {
                "key": "oauth", 
                "value": "1"
            }, 
            {
                "key": "method", 
                "value": "photos.getAlbums"
            }, 
            {
                "key": "uid", 
                "value": "6015870"
            }, 
            {
                "key": "access_token", 
                "value": "0275127e915981fe795840165e532169482cbdfc4ca1dbd48619a687a65fead88c468cdafe9743e231c37"
            }
        ]
    }
}

可能对你来说会产生更有用的信息,因为显然我没有适合我IP地址的访问令牌。:-)

撰写回答