将Google结果对象(纯JS)转换为Python对象
我正在尝试使用谷歌地图的建议API来请求地点名称的建议。不幸的是,我找不到相关的文档。
这里有一个示例链接:
http://maps.google.com/maps/suggest?q=lon&cp=3&ll=55.0,-3.5&spn=11.9,1.2&hl=en&gl=uk&v=2
这个链接会返回:
{suggestion:[{query:"London",...
我想在Python(2.5)中使用这个。正常的JSON格式应该是这样的,键周围有引号:
{"suggestion":[{"query":"London",...
我本可以使用simplejson或者其他工具,但现在我有点卡住了。
这里有两种可能的解决方案;要么我可以找到API的代码,看看有没有返回正确JSON格式的选项,要么我在Python中自己处理。
请问有什么想法吗?
3 个回答
0
import demjson
demjson.decode(google.js)
我在尝试解析Google Finance的期权“JSON”数据时发现了这个问题,很多人都提到这个数据并不符合JSON的标准。
demjson帮我省去了写复杂的正则表达式,它就是这么好用。
2
我会尝试去找找看怎么获取JSON数据,但如果不行的话,就有这个小怪物,肯定会有人对我大喊大叫的:
class Iden(object):
def __getitem__(name, index):
return index
notjson = '{...}'
data = eval(notjson, {}, Iden())
2
唉,这确实挺烦人的。这是一个JavaScript的字面量,但它——毫无意义地——不是JSON格式。
理论上,你应该可以从Python的标准库中导入 json.decoder.JSONDecoder
(或者在2.6之前的 simplejson
,它们是一样的),然后创建一个它的子类,再把这个子类传给 json.loads
来改变解码的行为。但实际上,这并不太可行,因为 json.decoder
里有很多全局的交叉引用,让子类化变得困难,而你需要修改的部分正好在 def JSONObject
的中间。
所以,可能值得看看其他的Python JSON库。我找到了一种 这个库,在“非严格”模式下,它可以解析没有引号的对象属性名:
>>> import demjson
>>> demjson.decode('{suggestion:[{query:"London",interpretation: ...')
{u'suggestion': [{u'query': u'London', u'operation': 2, u'interpretation': ...