JSON превращается в строку в двойных кавычках - Python Django - PullRequest
0 голосов
/ 12 ноября 2018

У меня довольно странный вопрос:

Итак, у меня есть простой словарь на python, который выглядит примерно так:

data={'Acoustics': {'Product Type': 'Acoustic Pod', 'Width [cm]': '1000', 'Noise Reduction Coefficient': '29 dB', 'Standards, Certification, and Documentation': 'PN EN-ISO 717-1:1999 ;  EN 13501 B, s1, d0', 'Material': 'MDF ;  Glass ;  Acoustic composite', 'Color': 'NCS ;  RAL', 'Installation Method': 'Own assembly ;  Installation by the manufacturer', 'Facing Material': 'MDF ;  Certified Paint', 'Type': 'Adjustable Ventilation ;  Motion Sensor ;  LED 6000K 2W ;  230V ;  RJ45 or USB Charger ;  Integrated seat and shelf'}}

, и я пытаюсь сохранить его через django на моем pgSQLбазы данных (со столбцом jsonb), и я каким-то образом получаю (обратите внимание на двойные кавычки в начале и конце):

"{'Acoustics': {'Product Type': 'Acoustic Pod', 'Width [cm]': '1000', 'Noise Reduction Coefficient': '29 dB', 'Standards, Certification, and Documentation': 'PN EN-ISO 717-1:1999 ;  EN 13501 B, s1, d0', 'Material': 'MDF ;  Glass ;  Acoustic composite', 'Color': 'NCS ;  RAL', 'Installation Method': 'Own assembly ;  Installation by the manufacturer', 'Facing Material': 'MDF ;  Certified Paint', 'Type': 'Adjustable Ventilation ;  Motion Sensor ;  LED 6000K 2W ;  230V ;  RJ45 or USB Charger ;  Integrated seat and shelf'}}"

Чтобы добавить в свою БД, я использую формы django, например, так:

form_data={"cvar": data}
form = myform(form_data)
if form.is_valid():
    form.save()

Итак, теперь у меня два вопроса: [1] Как мне избежать описанного выше сценария?Почему он получает quoted?Я просто передаю данные формы для сохранения, и она как-то заканчивается строкой, а не json.[2] Если у меня есть такой цитируемый json (что, к сожалению, я делаю сейчас), как я могу заключить его в кавычки и получить к нему доступ как к json (на данный момент это чертова строка!).

Спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Это не легко понять без MCVE, показывающего соответствующий код .

Похоже, вы записали в базу данных словарь, преобразованный в строку, а затем преобразованный в JSON, вместо непосредственного преобразования словаря в json.

Как:

>>> import json
>>> a={'Acoustics': {'Product Type': 'Acoustic Pod', 'Width [cm]': '1000', 'Noise Reduction Coefficient': '29 dB', 'Standards, Certification, and Documentation': 'PN EN-ISO 717-1:1999 ;  EN 13501 B, s1, d0', 'Material': 'MDF ;  Glass ;  Acoustic composite', 'Color': 'NCS ;  RAL', 'Installation Method': 'Own assembly ;  Installation by the manufacturer', 'Facing Material': 'MDF ;  Certified Paint', 'Type': 'Adjustable Ventilation ;  Motion Sensor ;  LED 6000K 2W ;  230V ;  RJ45 or USB Charger ;  Integrated seat and shelf'}}

, а затем:

>>> print(json.dumps(str(a)))
"{'Acoustics': {'Product Type': 'Acoustic Pod', 'Width [cm]': '1000', 'Noise Reduction Coefficient': '29 dB', 'Standards, Certification, and Documentation': 'PN EN-ISO 717-1:1999 ;  EN 13501 B, s1, d0', 'Material': 'MDF ;  Glass ;  Acoustic composite', 'Color': 'NCS ;  RAL', 'Installation Method': 'Own assembly ;  Installation by the manufacturer', 'Facing Material': 'MDF ;  Certified Paint', 'Type': 'Adjustable Ventilation ;  Motion Sensor ;  LED 6000K 2W ;  230V ;  RJ45 or USB Charger ;  Integrated seat and shelf'}}"

вместо:

>>> print(json.dumps(a))
{"Acoustics": {"Product Type": "Acoustic Pod", "Width [cm]": "1000", "Noise Reduction Coefficient": "29 dB", "Standards, Certification, and Documentation": "PN EN-ISO 717-1:1999 ;  EN 13501 B, s1, d0", "Material": "MDF ;  Glass ;  Acoustic composite", "Color": "NCS ;  RAL", "Installation Method": "Own assembly ;  Installation by the manufacturer", "Facing Material": "MDF ;  Certified Paint", "Type": "Adjustable Ventilation ;  Motion Sensor ;  LED 6000K 2W ;  230V ;  RJ45 or USB Charger ;  Integrated seat and shelf"}}

Если у вас уже есть представление в словаре Python в виде строки из какого-либо внешнего источника данных, то вы можете использовать ast.literal_eval (), чтобы сначала превратить его в правильный диктант :

>>> the_dict=ast.literal_eval(the_data)
>>> the_json=json.dumps(the_dict)

Или, предпочтительно, измените источник данных (например, веб-форму) на использование формата JSON вместо текстового представления Python для обмена данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...