..." />
標籤:

Python3中dict的派生類實例不能序列化為json?

Python 3.6.2 (default, Jul 20 2017, 03:52:27)
[GCC 7.1.1 20170630] on linux
Type "help", "copyright", "credits" or "license" for more information.
&>&>&> import json
&>&>&> class cls_from_dict(dict):
... pass
...
&>&>&> class cls_not_from_dict():
... pass
...
&>&>&> def cls2dict(obj):
... return obj.__dict__
...
&>&>&> cls_a = cls_from_dict()
&>&>&> cls_b = cls_not_from_dict()
&>&>&> cls_a.name = name_a
&>&>&> cls_b.name = name_b
&>&>&> print(cls_a.__dict__)
{name: name_a}
&>&>&> print(cls_b.__dict__)
{name: name_b}
&>&>&> print(cls2dict(cls_a))
{name: name_a}
&>&>&> print(cls2dict(cls_b))
{name: name_b}
&>&>&> print(json.dumps(cls_a, default=cls2dict))
{}
&>&>&> print(json.dumps(cls_b, default=cls2dict))
{"name": "name_b"}
&>&>&> print(json.dumps(cls_a, default=lambda o: o.__dict__))
{}
&>&>&> print(json.dumps(cls_b, default=lambda o: o.__dict__))
{"name": "name_b"}

  • 在學習 @廖雪峰 老師的`Python3`教程,碰到這個問題;
  • 如上代碼,為什麼 `json.dumps()` 中的 `default` 參數不能將 `dict` 的派生類的實例序列為 `JSON` 呢?
  • 在開會上不了 StackOverflow, V2EX 不能註冊,所以未到另為兩個網站提問;


&>&>&> cls_a[name] = name_a
&>&>&> cls_b[name] = name_b

派生的類也是dict,按dict語法操作


cls.name=「name a」a相當於給cls類動態添加了一個屬性name。但是因為你定義的那個類繼承自dict,我估計json會對dict類進行特殊處理,將dict中的鍵值對轉換成json,不處理其屬性的轉換。而對於非dict的類,則是對其屬性進行轉換。


cls_a.name 表示cls_a的name屬性 而不是 字典的 key


推薦閱讀:

【原創】R語言轉換並保存json文件--使用jsonlite包
JSON日誌文件
json是什麼?
SF 講堂推薦「JSON的SOA解決方案及其在雲服務API管理中的應用」要開播啦

TAG:Python | JSON |