52 votes

Python json.loads échoue avec `ValueError: Invalid control character at: line 1 column 33 (char 33)`

J'ai une chaîne comme celle-ci :

 s = u"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}"""

json.loads(s) renvoie un message d'erreur comme celui-ci :

 ValueError: Invalid control character at: line 1 column 33 (char 33)

Pourquoi cette erreur se produit-elle ? Comment puis-je résoudre ce problème?

117voto

drpoo Points 616

Une autre option, peut-être, consiste à utiliser l'argument strict=False

Selon http://docs.python.org/2/library/json.html

"Si strict est False (True est la valeur par défaut), alors les caractères de contrôle seront autorisés à l'intérieur des chaînes. Les caractères de contrôle dans ce contexte sont ceux dont les codes de caractères sont compris entre 0 et 31, y compris '\t' (tabulation), '\n ', '\r' et '\0'."

Par exemple:

 json.loads(json_str, strict=False)

8voto

Bogdan Points 2829

Essayez d'échapper à vos \n et \r :

 s = s.replace('\r', '\\r').replace('\n', '\\n')
json.loads(s)
>>> {u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'}

0voto

sheldonkreger Points 11

Dans certains cas, cette erreur sera déclenchée lorsque le fichier contient en fait une chaîne avec un espace. La suppression de l'espace résoudra le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X