解析JSON字符串时出错

时间:2012-04-29 02:14:11

标签: python json parsing

我在解析看似有效的json的json字符串时遇到了困难。

我的代码如下。我试图从URL中获取一些简单的json。

import urllib2    
import simplejson
req = urllib2.Request("http://www.rentrent.org/RENT/Ads.aspx?xmin=-118.01925659179687&ymin=33.71948521132481&xmax=-117.68142700195314&ymax=33.85644642218431&bd=&ba=&pets=-1&type=2&throwErrorIfOverLimit=false&callback=xxx")  

opener = urllib2.build_opener()    
f = opener.open(req)    
content = f.read();    
print "content = " + content   # Appears to print valid json string
json = simplejson.loads(content)

我在simplejson.loads(content)上收到错误:

raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)

这令人困惑,因为content似乎是一个非常好的json字符串。

我需要将这些数据作为单个元素来获取。任何想法如何摆脱这个错误?

1 个答案:

答案 0 :(得分:3)

这是一个jsonp api url。它期望返回一个包含在函数调用xxx()中的响应。看看如何处理jsonp。你目前得到的实际上并不是有效的jsonp。它的有效javascript。

这是另一个有关差异的问题:
What are the differences between JSON and JSONP?

您可以从网址中删除回调参数并返回纯json:
http://www.rentrent.org/RENT/Ads.aspx?xmin=-118.01925659179687&ymin=33.71948521132481&xmax=-117.68142700195314&ymax=33.85644642218431&bd=&ba=&pets=-1&type=2&throwErrorIfOverLimit=false

更新

我忽略了从url中删除回调参数实际上并没有告诉这个api返回JSON。它只能阻止它被包装成一个函数。返回值仍然不是json。这是javascript。具体来说,这是一个例子:

Javascript从返回值

{Status:'Success',

JSON

{'Status':'Success',

需要引用所有密钥。您的选择是:

  1. 查看api是否支持json返回值而不是jsonp
  2. 在解码之前对输出执行正则表达式修复以引用所有键