2010-04-29 13 views
2

J'essaie donc d'utiliser l'API de suggestion de Google Map pour demander des suggestions de noms de lieux. Malheureusement, je ne peux pas trouver les documents pour ce bit.Convertir l'objet de résultats Google (pure js) en objet Python

Voici un exemple URI:

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

qui retourne:

{suggestion:[{query:"London",... 

Je veux utiliser en Python (2.5). Maintenant en JSON bon il y aurait eu des citations autour des clés comme ceci:

{"suggestion":[{"query":"London",... 

et je aurais pu utiliser simplejson ou quelque chose, mais comme il est je suis un peu coincé.

Il y a deux solutions possibles ici; soit je peux accéder au code de l'API et trouver une option pour retourner le bon JSON, soit je le fais en python.

Des idées s'il vous plaît.

+0

Si vous ne pouvez pas trouver de documentation pour eux, peut-être qu'ils sont volontairement non documentés, alors sachez qu'ils peuvent changer ou cesser de travailler à tout moment pour une raison quelconque :) – badp

+0

Bon point. J'ai également remarqué que vous pouvez obtenir xml en ajoutant sortie = xml – user132262

Répondre

2

Ugh, c'est en effet assez ennuyeux. C'est un langage littéral JavaScript, mais ce n'est pas JSON.

En théorie, vous sont censés être en mesure d'importer json.decoder.JSONDecoder du stdlib Python (ou simplejson pré-2.6, qui est le même) et sous-classe, puis passer à cette sous-classe json.loads pour remplacer le comportement du décodeur. En réalité, ce n'est pas vraiment possible car json.decoder est plein de références croisées globales qui résistent à la sous-classe, et le bit que vous devez changer est un claquement au milieu de def JSONObject.

Il est donc probablement intéressant d'examiner d'autres bibliothèques Python JSON. J'ai trouvé this one qui, en mode « non stricte », analysera les noms de propriétés non cotées objet:

>>> import demjson 
>>> demjson.decode('{suggestion:[{query:"London",interpretation: ...') 
{u'suggestion': [{u'query': u'London', u'operation': 2, u'interpretation': ... 
+0

Fonctionne très bien. Merci. – user132262

2

Je voudrais essayer de fouiner afin d'obtenir JSON, mais à défaut il y a cette petite monstruosité que quelqu'un va inévitablement me crier dessus sur:

class Iden(object): 
    def __getitem__(name, index): 
    return index 

notjson = '{...}' 

data = eval(notjson, {}, Iden()) 
+0

Je ne suis pas vraiment sûr pourquoi cela fonctionne, mais c'est certainement le cas. Merci. – user132262

+0

Cela fonctionne parce que quand 'eval()' frappe la clé de 'suggestion', il recherche le nom dans les étendues qu'il a. La portée locale est créée à partir d'un mappage 'Iden', qui tourne simplement et renvoie la chaîne utilisée pour la recherche. Ainsi, la suggestion devient «suggestion», ce qui est une clé parfaitement valide. –

+0

eek! Vous devriez plutôt faire confiance à Google Maps pour leur permettre d'évaluer le code Python arbitraire sur votre serveur! :-) A part ça, il y a des problèmes avec tout nom non guillolé qui est un mot clé Python ou intégré, JS true/false/null sont retournés comme des chaînes, et comme toutes les chaînes sont des chaînes byte non décodées, les échappements '\ u' vont mal tourner. – bobince

0
import demjson 
demjson.decode(google.js) 

J'ai trouvé en essayant d'analyser l'option Google Finance données « JSON », qui, comme beaucoup notes , n'est pas conforme à JSON. Demjson m'a sauvé en écrivant une chaîne regex désagréable; ça marche juste.