2017-04-08 71 views
1

所以我有以下对象:的Python:序列化对象到JSON

import os 
import sys 
import json 

class ComplexEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, P): 
      return json.dumps(obj.__dict__) 
     # Let the base class default method raise the TypeError 
     return json.JSONEncoder.default(self, obj) 

class P(object): 
    def __init__(self): 
     self.name = "Unknown" 
     self.id = 1 
     self.lst = [] 

    def showName(self): 
     print(self.name) 
     for item in self.lst: 
      item.showName() 

    def add(self, p): 
     self.lst.append(p) 

    def serialize(self): 
     return json.dumps(self, cls=ComplexEncoder) 

class PFirst(P): 
    def __init__(self): 
     P.__init__(self) 
     self.name = "First" 
     self.id = 2 

p1 = PFirst() 
p1.showName() 

p = P() 
p.add(p1) 
p.showName() 

print(p.serialize()) 

我要让这reprezents对象p的属性的JSON,但我收到以下错误:

TypeError: <__main__.PFirst object at 0x000002AA287F1438> is not JSON serializable 

有人可以帮帮我吗?

回答

1
 return json.dumps(obj.__dict__) 

您再次呼吁json.dumps使用默认的编码器,这肯定不知道如何处理P对象。如果您确实想拨打json.dumps,请使用:

 return json.dumps(obj.__dict__, cls=type(self)) 
#          ^~~~~~~~~~~~~~~~ 

但是!如果打印结果,我们看到的结果是双编码为一个字符串:

"{\"name\": \"Unknown\", \"id\": 1, \"lst\": [\"{\\\"name\\\": \\\"First\\\", \\\"id\\\": 2, \\\"lst\\\": []}\"]}" 

如果检查ComplexEncoder例子,也是documentation of default(),我们会注意到,它应该返回一个“序列化对象”,不是序列化的字符串。所以,你真的应该写:

class ComplexEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, P): 
      return obj.__dict__   # <----- 
     return json.JSONEncoder.default(self, obj) 

输出:

{"name": "Unknown", "id": 1, "lst": [{"name": "First", "id": 2, "lst": []}]} 
+0

是的,它的工作原理。非常感谢你 –