Dan*_*n H 4 python json jsonpickle
我无法让 Python 的 jsonpickle 0.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)
Run Code Online (Sandbox Code Playgroud)
球有“颜色”,盒子有“内容”。如果我有一个[原生]球数组,那么就jsonpickle可以了。如果我有一盒 [native] 整数,那么就jsonpickle可以了。
但如果我有一盒球,jsonpickle炸弹带有"Ball object is not JSON serializable".
从堆栈跟踪中,我有预感编码器正在离开jsonpickle并转到其他一些 JSON 库......它显然不知道我已经注册了 BallHandler。
我该如何解决这个问题?
顺便说一句,我的示例没有明确使用 Django 的任何部分,但我需要它在 Django 应用程序中工作。
预先感谢您的任何意见!
我认为你可以回调到酸洗上下文来继续酸洗。
class BoxHandler(jsonpickle.handlers.BaseHandler):
def flatten(self, obj, data):
return [self.context.flatten(x,reset=False) for x in obj.contents]
Run Code Online (Sandbox Code Playgroud)
这似乎与 pickler.py:44 中内置 _list_recurse() 函数处理这种情况的方式类似,因为 flatten() 只是调用 self._flatten (在选择性地重置状态变量之后)。
def _list_recurse(self, obj):
return [self._flatten(v) for v in obj]
我现在只是对此进行测试,并且 _深度 似乎按预期保持。
| 归档时间: |
|
| 查看次数: |
4194 次 |
| 最近记录: |