Pythonのjsonpickle0.4.0を、カスタムオブジェクトを含むカスタムオブジェクトに「再帰」させるのに問題があります。これが私の問題を示すサンプルコードです。
import jsonpickle
import jsonpickle.handlers
class Ball(object):
def __init__(self, color):
self.color = color
class Box(object):
def __init__(self, *args):
self.contents = args
class BallHandler(jsonpickle.handlers.BaseHandler):
def flatten(self, obj, data):
data['color'] = obj.color
return data
class BoxHandler(jsonpickle.handlers.BaseHandler):
def flatten(self, obj, data):
data['contents'] = obj.contents
return data
jsonpickle.handlers.registry.register(Ball, BallHandler)
jsonpickle.handlers.registry.register(Box, BoxHandler)
# works OK -- correctly prints: {"color": "white"}
white_ball = Ball('white')
print jsonpickle.encode(white_ball, unpicklable=False)
# works OK -- correctly prints: [{"color": "white"}, {"color": "green"}]
green_ball = Ball('green')
balls = [white_ball, green_ball]
print jsonpickle.encode(balls, unpicklable=False)
# works OK -- correctly prints: {"contents": [1, 2, 3, 4]}
box_1 = Box(1, 2, 3, 4)
print jsonpickle.encode(box_1, unpicklable=False)
# dies with "Ball object is not JSON serializable"
box_2 = Box(white_ball, green_ball)
print jsonpickle.encode(box_2, unpicklable=False)
ボールには「色」があり、ボックスには「内容」があります。ボールの[ネイティブ]配列がある場合は、jsonpickle
機能します。[ネイティブ]intのボックスがある場合は、jsonpickle
機能します。
しかし、私がボールの箱を持っている場合、jsonpickle
爆弾は"Ball object is not JSON serializable"
。
スタックトレースから、エンコーダーがjsonpickle
他のJSONライブラリーに移動しているという予感があります...それは明らかに私がBallHandlerを登録したことを知りません。
どうすればこれを修正できますか?
ちなみに、私のサンプルはDjangoのどの部分も明示的に使用していませんが、Djangoアプリで動作させるにはこれが必要になります。
どんな入力でもよろしくお願いします!