是否可以將字典的每個值對轉換為 json,然后將它們作為一個 JSON 重新組合在一起,我嘗試這樣做,但它失敗了并且產生了奇怪的結果:
def toj(dict):
j=[]
for k,v in dict.items():
try:
j.append({json.dumps(k):json.dumps(v)})
except:
j.append({json.dumps(k):json.dumps(str(v))})
return j
為什么我需要它?-->
我需要在我的應用程式中傳遞字典實體,該應用程式當前使用 Flask 作為 Web 框架(將來可能會改變)。
from datetime import datetime
dic={'1':One, 2:'Two','list1':[1,2,3],'time_stamp':datetime.now()}
眾所周知,這本字典不是 json 可轉換的:
raise TypeError(f'Object of type {o.__class__.__name__} '
f'is not JSON serializable')
TypeError: Object of type datetime is not JSON serializable
Json.dumps 作用于整個物件,而不是每個鍵。因此,必須對整個物件進行清理。
幸運的是,我可以通過將有問題的物件轉換為 str 來解決這個問題。但這是不可能的,因為
- 我不知道哪個欄位是有問題的,因為字典是動態創建的,并且可以是任何長度
- 我不能只檢查型別 datetime ,因為它可能是許多物件之一,這些物件可以是任何型別,但都實作了str
- 我無法將整個 dict 轉換為 str ,因為然后將其轉換回 dict 會導致奇怪的問題。
- 僅供參考由于非常復雜的原因,我不能使用除 json 本身之外的任何其他庫。
- 傳遞默認值并沒有幫助,因為我無法更改我傳遞到轉儲中的物件的類,并且 JSON.dumps 再次獲取整個物件而不是它的一部分
全披露--->我的大腦不容易消化json
uj5u.com熱心網友回復:
你可以很容易地用default關鍵字來做到這一點json.dump
def handle_conversion(v):
if isinstace(v,datetime):
return str(v)
elif isinstance(v,some_other_thing_that_cannot_be_jsonified):
return "???" # a value that can be jsonified
return v
data = json.dumps(a_dict_with_datetimes,default=handle_conversion)
如果您只需要在 python 之間傳遞序列化資料,則可以使用該pickle模塊來代替序列化幾乎所有內容(但有時會根據您解碼的位置而中斷)
這是一個完整的作業示例
import json
from datetime import datetime
class some_other_thing_that_cannot_be_jsonified:
pass
def handle_conversion(v):
if isinstance(v,datetime):
return str(v)
elif isinstance(v,some_other_thing_that_cannot_be_jsonified):
return "???" # a value that can be jsonified
return v
a_dict_with_datetimes = {
"dt":datetime.now(),"a":"hello","w":"world","L":[1,2,3]
}
data = json.dumps(a_dict_with_datetimes,default=handle_conversion)
print(data)
# {"dt": "2022-10-09 16:21:19.643080", "a": "hello", "w": "world", "q": [1, 2, 3]}
您可以將其簡化為也始終回傳 str (它僅在無法對物件進行 jsonify 時才呼叫default),這將導致任何無法 jsonified 的物件被轉換為str
def handle_conversion(v):
# if isinstance(v,datetime):
# return str(v)
# elif isinstance(v,some_other_thing_that_cannot_be_jsonified):
# return "???" # a value that can be jsonified
return str(v)
uj5u.com熱心網友回復:
from datetime import datetime
def toj(dict):
conversions = {datetime: str}
for k, v in dict.items():
for instance, conv in conversions.items():
if isinstance(v, instance):
dict[k] = conv(v)
return json.dumps(dict)
您可以conversions根據您的要求進行更新。
執行:
In [1]: d = {'1':'One', 2:'Two','list1':[1,2,3],'time_stamp':datetime.now()}
In [2]: toj(d)
Out[2]: '{"1": "One", "2": "Two", "list1": [1, 2, 3], "time_stamp": "2022-10-10 00:39:00.604636"}'
編輯:
根據您的評論,如果都有可用的字串方法,您可以執行此操作。
def toj(dict):
for k, v in dict.items():
try:
json.dumps(v)
except (TypeError, OverflowError):
dict[k] = v.__str__()
return json.dumps(dict)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/512448.html
標籤:Pythonjson铸件
上一篇:如何在使用python中將json資料取消嵌套到資料框
下一篇:在擴展中更改innerHTML
