2012-12-27 3 views
4

J'envoie des demandes jsonrpc à un serveur web2py, avec un backend celery. Parfois, j'obtiens des erreurs que je veux analyser. Les erreurs se sont échappées dans la réponse jsonrpc, donc ils ne sont pas faciles à comprendre. Je reçois quelque chose comme ceci:Une manière intelligente d'annuler les données de la chaîne JSON?

{"version": "1.1", "id": "ID4", "error": {"message": "TypeError: 'NoneType' object does not support item assignment", "code": 100, "data": [" File \"/home/myuser1/tmp/web2py/gluon/tools.py\", line 4068, in serve_jsonrpc\n s = methods[method](*params)\n", " File \"/home/myuser1/tmp/web2py/applications/mycompany_portal/controllers/activity.py\", line 66, in get_cdr_page\n invalidate_cache = pars['invalidate_cache'], use_long_polling = pars['use_long_polling'])\n", " File \"/home/myuser1/projects/new-mycompany-portal/python_modules/pmq_client.py\", line 85, in get_page\n res = result.get(timeout=10)\n", " File \"/home/myuser1/.virtualenvs/python2.7.2-mycompany1/lib/python2.7/site-packages/celery/result.py\", line 119, in get\n interval=interval)\n", " File \"/home/myuser1/.virtualenvs/python2.7.2-mycompany1/lib/python2.7/site-packages/celery/backends/amqp.py\", line 138, in wait_for\n raise self.exception_to_python(meta['result'])\n"], "name": "JSONRPCError"}} 

Ce que je veux est d'obtenir la error.data partie de la réponse jsonrpc, unescape et l'afficher comme un stacktrace. Je peux le faire manuellement (changer \" ->" et traiter le \n), mais je voudrais éviter de réinventer la roue ici.

+0

Si tel est le JSON, la chaîne doit « pas contenir ces citations supplémentaires » après l'exécution à travers un désérialiseur JSON avant d'extraire la valeur .. –

+0

qui est le texte de la réponse, avant le traitement à travers le décodeur JSON. – dangonfast

+0

Donc: 'deserilize (json) ['erreur'] ['message']'? À moins qu'il y ait une bonne raison de ne pas le désérialiser, ce serait comme cela - de façon évidente et non intelligente - «éviter de réinventer la roue». –

Répondre

3

Est-ce unparsed cru JSON? Parse comme JSON:

import json 
print ''.join(json.loads(yourstring)['error']['data']) 
+1

+1 Sans contraintes supplémentaires, je désérialiserais d'abord le JSON. (La bibliothèque JSON gère déjà toutes les règles "difficiles".) –

+0

Oui, c'est ça! – dangonfast

-1

Re-edit:

Utilisation:

unquote

http://docs.python.org/2/library/urllib.html#urllib.unquote

ou

unquote_plus

http://docs.python.org/2/library/urllib.html#urllib.unquote_plus

pour désempiler les données de type HTTP (ie. pourcentage échapper)

Voir cette question et des réponses pour plus d'informations:

Unescape Python Strings From HTTP

Et, pour les symboles réguliers unescape-ment évadés (c.-à-antislash), l'utilisation .decode() (contrepartie.. encoder()). Voir ces réponses:

https://stackoverflow.com/a/10944959/1284631

https://stackoverflow.com/a/9340191/1284631

+0

urllib (et cette question liée) traite de l'URL/pourcentage d'encodage .. –

+0

@pst: OK, je comprends. Vous avez donc unquote() pour cent et decode() pour les antislashs. – user1284631

+0

Je me rends compte que ce sont des choses codées en json, rien à voir avec l'encodage de l'URL. – dangonfast

Questions connexes