2012-04-29 135 views
0

我在解析看起来是有效的json的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字符串。

我需要以个别元素的形式获取这些数据。任何想法如何摆脱这个错误?

+3

前JSON响应? – Blender 2012-04-29 02:15:51

+1

您可以通过给出有效的json或忽略失败来消除错误。需要查看json。 – jdi 2012-04-29 02:19:59

+0

我想纠正我最后的评论,说我们现在不需要看到json。我查看了网址并查看了数据,尽管如果在此处张贴摘录,它对每个人都很方便。 – jdi 2012-04-29 04:30:25

回答

3

这是一个jsonp api url。它期望返回给你一个包含在函数调用xxx()中的响应。研究如何处理jsonp。你目前得到的并不是真正有效的jsonp。其有效的JavaScript。

这里是关于的区别了另一个问题:
What are the differences between JSON and JSONP?

您可以从您的网址删除回调PARAM并取回纯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. 请在输出端的正则表达式修复你能发布引用的所有密钥的解码
+0

谢谢!我看到它如何不再包裹在函数调用中。但它仍然不会解析。我得到一个'提高JSONDecodeError(“期待属性名称”,S,结束) simplejson.decoder.JSONDecodeError:期望属性名称:第1行第1列(字符1)'该网址是否返回一个有效的JSON或我解析它不正确? – codingJoe 2012-04-29 04:28:50

+0

如果提供了回调参数,一些API(比如Stripe's)将返回JSONP,否则返回JSON。 – btk 2013-03-10 04:03:07