2011-09-22 2 views
0

J'ai une chaîne JSON que je poste sur mon script Python. Ceci est un exemple de chaîne:simplejson en Python renvoie une erreur de valeur

{"uid":"1111111","method":"check_user"} 

Dans mon code Python j'appelle simplement simplejson.loads(str)str est la chaîne JSON de la demande. La chaîne JSON semble bien, car lorsque je l'imprime à la demande, elle est intacte. Cependant, j'obtiens un ValueError:

Extra data: line 1 column 41 - line 1 column 48 (char 41 - 48) 
Traceback (most recent call last): File 
"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/_webapp25.py", 
line 703, in __call__ 
    handler.post(*groups) File "/Users/.../app/controller/api_controller.py", line 25, in post 
    req = simplejson.loads(req) File 
"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django_0_96/django/utils/simplejson/__init__.py", 
line 232, in loads 
    return cls(encoding=encoding, **kw).decode(s) File 
"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django_0_96/django/utils/simplejson/decoder.py", 
line 254, in decode 
    raise ValueError(errmsg("Extra data", s, end, len(s))) 

Des idées de quoi il s'agit? J'ai essayé de supprimer de nouvelles lignes, des tabulations et des barres obliques de la chaîne, même en le décodant en utilisant .decode('string_escape')

+0

La pile ici n'est pas utile. Essayez de minimiser la portée, et cela vous aidera probablement à identifier les erreurs. Ou essayez de mettre des empreintes pour vous assurer que les valeurs sont correctes. Si ce n'est pas utile, essayez d'éliminer les dépendances, idéalement, mettez tout dans un seul fichier et postez à nouveau. –

+1

@RomanHwang En fait, c'était toute l'information nécessaire pour répondre à la question. Il a expliqué qu'il savait que c'était la partie (imprimable de la chaîne) qui était transmise à JSON parce qu'il «l'imprimait», et il a fourni l'erreur. – agf

Répondre

6

Vous avez un caractère non imprimable dans votre chaîne. Je reçois la même erreur si j'ajouter un octet nul à la fin de la chaîne, et print ing il ne montre pas le problème:

>>> import json 
>>> string = '{"uid":"1111111","method":"check_user"}\x00' 
>>> print string 
{"uid":"1111111","method":"check_user"} 
>>> print repr(string) 
'{"uid":"1111111","method":"check_user"}\x00' 
>>> json.loads(string) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Python27\Lib\json\__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python27\Lib\json\decoder.py", line 369, in decode 
    raise ValueError(errmsg("Extra data", s, end, len(s))) 
ValueError: Extra data: line 1 column 39 - line 1 column 40 (char 39 - 40) 

Imprimer la repr de votre chaîne au moment de la demande et vous devriez le voir .

+0

Génial! Alors, comment les couper de la corde? –

+0

En fait, fait en utilisant: str.replace ('\ x00', '') –

+0

@AhmedNuaman - Ce n'est pas nécessairement à la fin de la chaîne. C'est probablement le même mauvais caractère qui le fait à chaque fois. Je trouverais lequel avec 'repr' et puis juste faire' json.loads (mystring.replace ('\ x00', '') ', avec ce que la valeur du mauvais caractère/caractère est à la place de' \ x00' – agf