перетворення json у рядок у python


79

На початку я чітко не пояснив свої запитання. Спробуйте використовувати 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).

Як це зробити?


Друга форма, по суті, не є JSON.

Існує велика різниця, коли у вас є одинарні та подвійні лапки, спробуйте завантажити за допомогою json.loads, використовуючи версію str
Padraic Cunningham

json.dumps()призначений для перетворення в JSON, а не з JSON у рядок.
Бармар

2
strне має абсолютно нічого спільного з JSON; той факт, що str(somedict)схожий на JSON - це випадковість. strотримує рядкове представлення об’єкта, який може виглядати не як JSON (наприклад, для класів, що реалізують __str__).
Полковник тридцять два,

1
@BAE JSON вимагає рядків із подвійними лапками. Рядки з одинарними лапками в JSON недійсні.
Полковник тридцять два,

Відповіді:


137

json.dumps()- це набагато більше, ніж просто створення рядка з об’єкта Python, воно завжди створює дійсний рядок JSON (припускаючи, що все всередині об’єкта можна серіалізувати) після таблиці перетворення типів .

Наприклад, якщо одне зі значень є 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}

Насправді мене більше цікавить їхня різниця в одинарних і подвійних лапках у вихідному рядку.
BAE

@BAE, ну, у цьому випадку це просто: stackoverflow.com/questions/4162642/… .
alecxe

1

Є й інші відмінності. Наприклад, {'time': datetime.now()}не можна серіалізувати в JSON, але можна перетворити на рядок. Вам слід використовувати один із цих інструментів залежно від мети (тобто чи буде результат потім розшифрований).


Насправді мене більше цікавить їх різниця в одинарних та подвійних лапках.
BAE

Тоді alecxe відповів вам.
Євген Примако
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.