2016-09-06 40 views
1

我正在嘗試自定義編碼,但出現錯誤。下面的代碼示例生成錯誤:Python中的json編碼問題

#!/usr/bin/python3 

import json 

class Contact: 
    def __init__(self, first, last): 
    self.first = first 
    self.last = last 

    @property 
    def full_name(self): 
    return ("{} {}".format(self.first, self.last)) 

class ContactEncoder(json.JSONEncoder): 
    def defualt(self, obj): 
    if isinstance(obj, Contact): 
     return {"is_contact": 'T' 
       ,"first": obj.first 
       ,"last": obj.last 
       ,"full_name": obj.full_name} 
    return super().defualt(obj) 

if __name__ == "__main__": 
    c = Contact("Jay", "Loophole") 
    print(json.dumps(c.__dict__)) 
    print(json.dumps(c, cls=ContactEncoder)) 

產生的錯誤是:

{"first": "Jay", "last": "Loophole"} 
Traceback (most recent call last): 
    File "json_dump.py", line 26, in <module> 
    print(json.dumps(c, cls=ContactEncoder)) 
    File "/usr/lib/python3.5/json/__init__.py", line 237, in dumps 
    **kw).encode(obj) 
    File "/usr/lib/python3.5/json/encoder.py", line 198, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode 
    return _iterencode(o, 0) 
    File "/usr/lib/python3.5/json/encoder.py", line 179, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: <__main__.Contact object at 0x7ffb3445a400> is not JSON serializable 

成功顯示默認字典,但是當一個自定義的編碼被作爲CLS參數傳遞,會產生錯誤。 有關錯誤原因的任何建議?

+0

Typo? 'defual()'應該是'default()' – dhke

+0

@dhke就是這樣。修復打字錯誤OP,它工作正常。 –

+0

很好,謝謝,不夠細心! – alortimor

回答

0

這裏是defUAlt --> defAUlt修正後您的更新代碼:

import json 

class Contact: 
    def __init__(self, first, last): 
    self.first = first 
    self.last = last 

    @property 
    def full_name(self): 
    return ("{} {}".format(self.first, self.last)) 

class ContactEncoder(json.JSONEncoder): 
    def default(self, obj): 
    if isinstance(obj, Contact): 
     return {"is_contact": 'T' 
       ,"first": obj.first 
       ,"last": obj.last 
       ,"full_name": obj.full_name} 
    return super().default(obj) 

if __name__ == "__main__": 
    c = Contact("Jay", "Loophole") 
    print(json.dumps(c.__dict__)) 
    print(json.dumps(c, cls=ContactEncoder)) 

你可以檢查出來住上this page