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