json
和simplejson
都支持json.JSONEncoder
的扩展,目的是序列化非基础对象。但是,从文档中我无法理解如何安全地执行此操作。
这是我的编码器:
class ReprEncoder(json.JSONEncoder):
@staticmethod
def of(*types):
return ft.partial(ReprEncoder, types)
def __init__(self, repr_types, **kwargs):
self.__repr_types = repr_types
super(ReprEncoder, self).__init__(**kwargs)
def default(self, obj):
if type(obj) in self.__repr_types:
return 'r[%r]' % obj
return super(ReprEncoder, self).default(obj)
of
方法允许我提供支持序列化的类,并使用约定r[%r]
表示此类对象。在反序列化方面,如果匹配r[
... ]
,我计划使用这样的策略,然后使用某些(可能是安全的!)eval
反序列化技术
假设对于某些课程C
,C.__repr__
有效as expected我可以按照以下方式调用它:
c = C('foo', 'bar', 3)
json.dumps(c, cls=ReprEncoder.of(C))
从文档中我们不清楚如何转义意外匹配我的语义的字符串。这个想法是:如果要编码的字符串与r[
... ]
语法匹配,那么预先挂起反斜杠 + 在反序列化时,向后看r
用于反斜杠。
这样的伎俩:
def default(self, obj):
# ...
if type(obj) in types.StringTypes and obj.startswith('r'):
obj = '\\' + obj
return super(ReprEncoder, self).default(obj)
不起作用,因为仅当默认编码器没有关于如何解码数据的线索时才调用default
方法。此外,json.JSONEncode
没有实现string
(或类似)之类的内容,我可以覆盖。
任何提示?