将Google结果对象(纯JS)转换为Python对象

2 投票
3 回答
821 浏览
提问于 2025-04-15 22:08

我正在尝试使用谷歌地图的建议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': ...

撰写回答