我正在尝试使用带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?
非常感谢任何帮助或更好的方法!
答案 0 :(得分:2)
No JSON Object could be decoded
和the 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)