2016-09-06 51 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