2017-04-08 8 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()) 

私はオブジェクトpの属性をreprezents JSONを作りたいが、私は、次のエラーが表示さ:

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

を誰か助けてくれますか?

答えて

1
 return json.dumps(obj.__dict__) 

あなたはきっとPオブジェクトに対処する方法がわからないこれは、再びデフォルトのエンコーダでjson.dumpsを呼び出しています。 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

をはい、それは動作します。どうもありがとうございました –

関連する問題