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!

Était-ce utile?

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

Essayez

Peut-être que simplejson est trop "simple".

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top