来自curl的JSON作为函数参数

时间:2013-12-03 13:53:37

标签: python json bash curl

我正在尝试使用带curl的API,返回JSON:

response=$(curl -i --user api:$APIKey --data-binary @$target https://api.tinypng.com/shrink)

接下来,我尝试使用函数解析(简要)响应:

parseJson(){
    result="$1"
    result=($(echo $result | python -mjson.tool))
    result=${result%\"*}
    result=${result##*\"}
    return $result
}

我称之为:message=$(parseJson "$response" message)。仅供参考,答复是多方面的。

但奇怪的事情发生了:python给了我No JSON object could be decoded,但如果我回显了$ result,那么就有一个好的JSON字符串。更奇怪的是,如果我在调用python之前回应它,看起来无论如何都会首先执行python。

有一些异步技巧吗?为什么我不能将变量字符串传递给python?

非常感谢任何帮助或更好的方法!

2 个答案:

答案 0 :(得分:2)

No JSON Object could be decodedthe response is on multiple lines是我认为的关键。该错误通常从空字符串上的mjson.tools返回,而格式错误的JSON通常会返回更详细的内容。

JSON解析器不会超过第一个换行符(在引用字符串值之外)。它可能会收到类似\ r \ n {“key”:“value”}并失败的内容。如果由于某种原因响应是多行的,那么你应该解析出响应体(JSON)而不带前导或尾随\ r \ n的

答案 1 :(得分:1)

您可以尝试HttpConnection而不是调用curl并直接在python中执行所有操作:

conn = httplib.HTTPConnection('www.a_url.com')
conn.request("GET", /index.html')
response = conn.getresponse()
status = response.status
if status != 200:
    print 'ERROR'
    sys.exit(1)
reason = response.reason
answer = response.read()

为了让json做到:

received_json = None
try:
    json.loads(answer)
except:
    print 'ERROR'
    sys.exit(2)