Décoder le JSON complexe en Python
-
22-07-2019 - |
Question
J'ai un objet JSON créé en PHP, cet objet JSON contient une autre chaîne JSON échappée dans l'une de ses cellules:
php > $insidejson = array('foo' => 'bar','foo1' => 'bar1'); php > $arr = array('a' => array('a1'=>json_encode($insidejson))); php > echo json_encode($arr); {"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}
Puis, avec Python, j'essaie de le décoder à l'aide de simplejson:
>>> import simplejson as json >>> json.loads('{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}')
Cela échoue avec l'erreur suivante:
Traceback (most recent call last): File "", line 1, in ? File "build/bdist.linux-i686/egg/simplejson/__init__.py", line 307, in loads File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 335, in decode File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 351, in raw_decode ValueError: Expecting , delimiter: line 1 column 14 (char 14)
Comment puis-je obtenir cet objet JSON décodé en Python? PHP et JS le décodent avec succès et je ne peux pas en modifier la structure, car cela nécessiterait des modifications majeures dans de nombreux composants dans différentes langues.
Merci!
La solution
Essayez de préfixer votre chaîne avec "r" pour en faire une chaîne brute:
# Python 2.6.2
>>> import json
>>> s = r'{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}'
>>> json.loads(s)
{u'a': {u'a1': u'{"foo":"bar","foo1":"bar1"}'}}
Ce que dit Alex ci-dessous est vrai: vous pouvez simplement doubler les barres obliques. (Sa réponse n’a pas été publiée au début.) Je pense que l’utilisation de chaînes brutes est plus simple, ne serait-ce que parce qu’il s’agit d’une fonction de langage qui signifie la même chose et qui rend plus difficile de se tromper.
Autres conseils
Si vous souhaitez insérer des barres obliques inverses dans une chaîne, vous devez les échapper.
import simplejson as json
json.loads('{"a":{"a1":"{\\"foo\\":\\"bar\\",\\"foo1\\":\\"bar1\\"}"}}')
Je l'ai testé et Python gère correctement cette entrée - à l'exception du module json inclus dans la bibliothèque standard ( import json
, Python 3.1).