Подтвердить что ты не робот

Преобразование json в строку в python

Я не объяснил свои вопросы четко в начале. Попробуйте использовать str() и json.dumps() при преобразовании JSON в строку в 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'}"

Мой вопрос:

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

Мой ожидаемый результат: "{'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"\'}'

Мой ожидаемый результат: "{'jsonKey': 'jsonValue','title': 'hello world\"'}"

Нет необходимости снова менять выходную строку на json (dict).

Как это сделать?

4b9b3361

Ответ 1

json.dumps() - это нечто большее, чем просто создание строки из объекта Python, она всегда будет выдавать действительный JSON string (при условии, что все внутри объекта сериализуется), следуя Таблица преобразования типов.

Например, если одно из значений None, str() приведет к недопустимому JSON, который нельзя загрузить:

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

Но dumps() преобразует None в null, создавая допустимую строку JSON, которая может быть загружена:

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

Ответ 2

Существуют и другие различия. Например, {'time': datetime.now()} не может быть сериализована в JSON, но может быть преобразована в строку. Вы должны использовать один из этих инструментов в зависимости от цели (то есть результат будет позже декодирован).