簡體   English   中英

為什么我不能在 Python 中反序列化帶有單引號的 JSON 字符串?

[英]Why can I not deserialise a JSON string with single quotes in Python?

我正在使用 json 反序列化從我的 MySQL 數據庫接收到的字符串,以便生成的對象是一個字典。
這是代碼:

sql.cursorobj.execute("SELECT * FROM timetableevents")
for record in sql.cursorobj.fetchall():
    print(record)
    obj= record['btnobject']
    detailsdict[obj]=json.loads(record['details'])    #I am facing an error here

我得到的錯誤是:

{'btnobject': 'btnobject1', 'details': "{'sno':[], 'time':[], 'events':[]}"}
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\veeru\Python 3.9.2\lib\tkinter\__init__.py", line 1892, in __call__
  return self.func(*args)
File "c:\Users\veeru\OneDrive\Visual Studio\Timetable\TimeTable.py", line 186, in <lambda>
  addtaskbtn.configure(command=lambda x=(btnobj, tableframe): ae.addtaskbtnclick(x[0], x[1]))
File "c:\Users\veeru\OneDrive\Visual Studio\Timetable\addevent.py", line 33, in addtaskbtnclick
  updateglobalvalues(btnobj)
File "c:\Users\veeru\OneDrive\Visual Studio\Timetable\addevent.py", line 22, in updateglobalvalues
  detailsdict[obj]=json.loads(f"{record['details']}")
File "C:\Users\veeru\Python 3.9.2\lib\json\__init__.py", line 346, in loads
  return _default_decoder.decode(s)
File "C:\Users\veeru\Python 3.9.2\lib\json\decoder.py", line 337, in decode
  obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\veeru\Python 3.9.2\lib\json\decoder.py", line 353, in raw_decode
  obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

上述錯誤代碼中的最后一行是最重要的 ig。
我已經嘗試將record['details']明確地用雙引號括起來我還使用了fstrings例如: json.loads(f"{record['details']}")
**筆記: **
請記住, json.loads(record['details'])以前可以工作,但是在我更改數據庫后,它停止工作。

如果您嘗試加載

print(json.loads('{"sno":[], "time":[], "events":[]}'))

它不會給你任何錯誤,因為鍵是雙 qoute,你會得到結果

{'sno': [], 'time': [], 'events': []}

但如果你不能改變輸出,那么首先嘗試json.dumps

print(json.dumps("{'sno':[], 'time':[], 'events':[]}"))

這會給你

'"{\'sno\':[], \'time\':[], \'events\':[]}"'

您的 JSON 字符串無效。

來自json.org

字符串是零個或多個 Unicode 字符的序列,用雙引號括起來,使用反斜杠轉義。

它有單引號,而 JSON 字符串應該有雙引號才有效。

您實際上無法從數據庫中批量替換引號,因此json.dumps在加載 JSON 之前使用json.dumps來轉換引號。

嘗試這個:

detailsdict[obj]=json.loads(json.dumps(record['details']))

或使用ast.literal_eval

import ast
`detailsdict[obj]=json.loads(ast.literal_eval(record['details']))`

您在我們的字符串中有單引號,因此您會收到此錯誤。 您可以做的是將'替換為"然后執行json.loads如下:

sql.cursorobj.execute("SELECT * FROM timetableevents")
for record in sql.cursorobj.fetchall():
    print(record)
    obj= record['btnobject']
    # Replace ' with "
    details = record['details'].replace("'", '"')
    detailsdict[obj]=json.loads(details)    #I am facing an error here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM