web-dev-qa-db-fra.com

convertir json en chaîne dans python

Je n'ai pas expliqué mes questions clairement au début. Essayez d'utiliser str() et json.dumps() lors de la conversion de JSON en chaîne en python.

>>> data = {'jsonKey': 'jsonValue',"title": "hello world"}
>>> print json.dumps(data)
{"jsonKey": "jsonValue", "title": "hello world"}
>>> print str(data)
{'jsonKey': 'jsonValue', 'title': 'hello world'}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world"}'
>>> str(data)
"{'jsonKey': 'jsonValue', 'title': 'hello world'}"

Ma question est:

>>> data = {'jsonKey': 'jsonValue',"title": "hello world'"}
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': "hello world\'"}'
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\'"}'
>>> 

Mon résultat attendu: "{'jsonKey': 'jsonValue','title': 'hello world''}"

>>> data = {'jsonKey': 'jsonValue',"title": "hello world""}
  File "<stdin>", line 1
    data = {'jsonKey': 'jsonValue',"title": "hello world""}
                                                          ^
SyntaxError: EOL while scanning string literal
>>> data = {'jsonKey': 'jsonValue',"title": "hello world\""}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\\""}'
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': \'hello world"\'}'

Mon résultat attendu: "{'jsonKey': 'jsonValue','title': 'hello world\"'}"

Il n'est pas nécessaire de changer à nouveau la chaîne de sortie en json (dict) pour moi.

Comment faire ça?

49
BAE

json.dumps() est beaucoup plus que créer une chaîne à partir d'un objet Python, il produira toujours un valide JSON chaîne (en supposant que tout ce qui se trouve à l'intérieur de l'objet est sérialisable) après le table de conversion de type .

Par exemple, si l'une des valeurs est None, la str() produira un JSON invalide qui ne peut pas être chargé:

>>> data = {'jsonKey': None}
>>> str(data)
"{'jsonKey': None}"
>>> json.loads(str(data))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)

Mais la dumps() convertirait None en null, créant ainsi une chaîne JSON valide pouvant être chargée:

>>> import json
>>> data = {'jsonKey': None}
>>> json.dumps(data)
'{"jsonKey": null}'
>>> json.loads(json.dumps(data))
{u'jsonKey': None}
88
alecxe

Il y a d'autres différences. Par exemple, {'time': datetime.now()} ne peut pas être sérialisé en JSON, mais peut être converti en chaîne. Vous devez utiliser l’un de ces outils en fonction de l’objet recherché (c’est-à-dire que le résultat sera décodé ultérieurement).

1
Eugene Primako