装饰器方法进行JSON序列化?

时间:2017-07-05 02:43:36

标签: python json serialization python-decorators

我正在使用JSON将数据从Python发送到R(注意:我对R比Python更熟悉)。对于原语,json模块工作得很好。对于许多其他Python对象(例如numpy数组),您必须定义自定义编码器,如此stack overflow answer。但是,这需要您将编码器作为参数传递给json.dumps,这对我的情况不起作用。 我知道还有像json_tricks这样的其他软件包具有更高级的JSON序列化功能,但由于我无法控制用户拥有的Python分发,我不想依赖任何非默认模块用于将对象序列化为JSON。

我想知道是否有办法使用 contextlib 装饰器来定义序列化JSON对象的其他方法。理想情况下,我正在寻找一种方法,允许用户重载我提供的一些标准函数standard_wrapper,为他们自己的类(或者他们加载的模块中的类型)添加新方法,而不需要他们修改{{ 1}}。下面有一些伪代码:

standard_wrapper

这实际上是按类型重载的函数 ---我在Python中看到了overloading by arguments的示例,但我没有看到如何按类型执行。

编辑我正在将装饰器与import json def standard_wrapper(o): return o obj = [44,64,13,4,79,2,454,89,0] json.dumps(obj) json.dumps(standard_wrapper(obj)) import numpy as np objnp = np.sort(obj) json.dumps(objnp) # FAILS @some_decorator_to_overload_standard_wrapper # some code json.dumps(standard_wrapper(objnp)) # HOPEFULLY WORKS 混合(我以前只见过装饰器)。

1 个答案:

答案 0 :(得分:1)

singledispatch模块中使用functools可以轻松地按类型重载函数,如此answer所示。但是,可以满足我需要的更简单的解决方案是创建一个函数字典,其中键对应于对象类型。

import numpy
func_dict = {}
a = [2,5,2,9,75,8,36,2,8]
an = numpy.sort(a)

func_dict[type(an)] = lambda x: x.tolist()
func_dict[type(a)] = lambda x: x

import json
json.dumps(func_dict[type(a)](a))
json.dumps(func_dict[type(an)](an))

通过在字典中添加另一个函数来实现对其他类型的支持。