【问题标题】:JSON from curl as a function parameter来自 curl 的 JSON 作为函数参数
【发布时间】:2013-12-03 13:53:37
【问题描述】:

我正在尝试使用带有 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 ?

任何帮助或更好的方法将不胜感激!

【问题讨论】:

  • 你确定你收到的字符串是一个实际的 json 字符串吗?例如,您是否在 jsonformatter.curiousconcept.com 上检查过?
  • 我在终端上测试过,效果很好。即使在没有 bash 功能的情况下对其进行了测试,也可以正常工作。这就是为什么我想知道是否将它作为参数传递会以某种方式影响它

标签: python json bash curl


【解决方案1】:

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

JSON 解析器不会越过第一个换行符(引号字符串值之外)。它可能会收到类似 \r\n{"key":"value"} 的东西并且失败了。如果由于某种原因响应在多行上,那么您应该解析出响应正文 (JSON),而不是前导或尾随 \r\n's

【讨论】:

  • 你是对的,我的回声没有显示我的 JSON 之前有行(主要是 HTTP 标头)。当我用tail 剥离那些东西时,它可以完美地工作!
【解决方案2】:

你可以尝试 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)

【讨论】:

  • 我对 Python 不是很熟悉,那么我应该如何将我的 curl 参数(--user & --data-binary)设置为我的 HTTPConnection?谢谢
  • 这可能是一个不同的问题。但是看看 stackoverflow.com/q/34079/1141095 的例子,虽然它不是 HttpConnection,但在我的例子中应该也可以使用
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多