JSON表示法只有少数本机数据类型(对象,数组,字符串,数字,布尔值和null),因此以JSON序列化的任何内容都必须表示为这些类型之一。
如json模块docs所示,此转换可以由
JSONEnprer 和 JSONDeprer
自动完成,但随后您将放弃可能需要的其他一些结构(如果将集转换为列表,则将失去恢复常规数据的能力。列表;如果使用将集转换为字典,
dict.fromkeys(s)则将失去恢复字典的能力)。
一个更复杂的解决方案是构建可以与其他本机JSON类型共存的自定义类型。这使您可以存储包括列表,集合,字典,小数,日期时间对象等的嵌套结构:
from json import dumps, loads, JSONEnprer, JSONDeprerimport pickleclass PythonObjectEnprer(JSONEnprer): def default(self, obj): if isinstance(obj, (list, dict, str, unipre, int, float, bool, type(None))): return JSONEnprer.default(self, obj) return {'_python_object': pickle.dumps(obj)}def as_python_object(dct): if '_python_object' in dct: return pickle.loads(str(dct['_python_object'])) return dct
这是一个示例会话,显示它可以处理列表,字典和集合:
>>> data = [1,2,3, set(['knights', 'who', 'say', 'ni']), {'key':'value'}, Decimal('3.14')]>>> j = dumps(data, cls=PythonObjectEnprer)>>> loads(j, object_hook=as_python_object)[1, 2, 3, set(['knights', 'say', 'who', 'ni']), {u'key': u'value'}, Decimal('3.14')]
另外,使用更通用的序列化技术(例如YAML,Twisted
Jelly或Python的pickle模块)可能很有用。它们每个都支持更大范围的数据类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)