3 votes

json.loads(jsonstring) en Python échoue si la chaîne contient un " \r "c'est-à-dire le caractère de retour à la ligne

J'obtiens une chaîne JSON qui contient un élément "\r" quelque part, par exemple "{"data":"foo \r\n bar"}" Lorsque j'essaie de l'analyser, il produit ValueError .

>>> j="""{"data":"foo \r\n bar"}"""
>>> import json
>>> f=json.loads(j)

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    f=json.loads(j)
  File "C:\Python27\lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 13 (char 13)
>>> j[13]
'\r'

"\r" est un caractère parfaitement légal dans une chaîne Python.

Comment puis-je analyser cette chaîne JSON de telle sorte que

>>> dct = somehow_parse_json(j)
>>> dct['data']
'foo \r\n bar'

Je pourrais facilement trouver et extraire les caractères de retour chariot, mais je préférerais qu'ils puissent être sauvegardés.

5voto

DrTyrsa Points 14349

Les barres obliques doivent être échappées dans le JSON :

j="""{"data":"foo \\r\\n bar"}"""

Si vous ne les échappez pas, votre JSON n'est pas valide (étant une chaîne Python valide).

1voto

Yugal Jindle Points 5931

Logiquement python fait ce qui aurait dû être fait !

C'est toujours la même chose CRLF (inspiré des machines à écrire) CR = Carraige Return (retour chariot) LF = Line Feed (saut de ligne)

' \r ' signifie CR Mais ' \n ' = CR + LF Donc, ce que je veux dire, c'est que pour json il n'est absolument pas valable.

F print ' \n 123456 \rone ' # one3456

Maintenant, comment utiliser \r Quoi qu'il en soit ?

# if j is your json
j = j.replace('\r','\\r')

Cela ne devrait échapper qu'aux \r con \\r

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