帮助组合对象以构建json。

emitjson的Python项目详细描述


帮助组合对象以发出json。

emitjson.repository()创建一个函数库,用于将各种类型的对象转换为对json友好的对象。存储库是一个single-dispatch generic function,如果类型的转换器已注册,则返回已转换的对象。

存储库包含一些json模块不支持的类型的默认转换器,例如set()datetime.datetime()。此外,默认存储库还返回标准容器类型(浅层)的副本,例如collections.abc.Mappingcollection.abc.Sequence。容器对象中的项也会递归转换。

>>> import datetime
>>> import emitjson
>>> my_repo = emitjson.repository()  # create emitjson repository
>>> src = [1, 2, datetime.datetime.now(), {4, 5, 6}]
>>> new = my_repo(src)
>>> print(new)
(1, 2, '2016-04-20T22:09:18.731157', (4, 5, 6))

您可以将自己的转换器添加为singledispatch function。下面的示例添加一个转换器以从bytes对象生成base64字符串。

>>> import emitjson
>>> import base64
>>> my_repo = emitjson.repository()  # create emitjson repository
>>> @my_repo.register(bytes)
>>> def conv_bytes(obj):
...    # encode bytes object in Base64 format
...    return base64.b64encode(obj).decode('ascii')
...
>>> print(my_repo([b'abcd']))
('YWJjZA==', )

还可以定义映射器类以将对象转换为字典。

from emitjson repository, attr, ObjConverter

class Class1:
    def __init__(self):
        self.prop1 = 'spam'
        self.prop2 = 'ham'

class Class2:
    def __init__(self):
        self.prop3 = [Class1()]


my_repo = emitjson.repository()  # create emitjson repository

@my_repo.register(Class1)
class Class1Converter(ObjConverter):
    prop1 = attr    # get obj.prop1
    prop2 = attr    # get obj.prop2

@my_repo.register(Class2)
class Class2Converter(ObjConverter):
    prop_x = attr('prop3')  # get obj.prop3 but store as 'prop_x'

要求

  • python 3.4或更高版本

功能

@存储库()

创建对象转换器的存储库。存储库是single-dispatch generic function的实例。

默认情况下,存储库覆盖以下类型。

  • collections.abc.Sequence对象转换为tuple。序列中的元素是递归转换的。
  • collections.abc.Mapping的键和值是递归转换的。
  • datetime.datedatetime.datetime对象转换为isoformat()字符串。

objconverter类

ObjConverter类创建从任意对象到字典的转换器。从对象获取的值也会递归转换。

要转换的属性名定义为ObjConverter类的attr类成员。

如果ObjConverter的属性是attr的实例,attrname参数指定要转换的属性名。

生成的dict对象也会递归转换。

objconverter.on_convert(obj,值)

on_convert方法被调用以获取obj的属性并将该值存储到values字典中。您可以重写on_convert()方法以自定义转换。

class Class3:
    prop = 1

@myrepo.register(Class3)
class Class3Converter(ObjConverter):
    def on_convert(self, obj, values):
        super().on_convert(obj, values)
        values['dynamic_prop'] = obj.prop

print(myrepo(Class3())  # prints {'dynamic_prop': 1}

attr(attrname=none,map=none)类

转换对象的属性。

attrname如果不省略,则重写属性名。

map参数是将目标对象转换为任意对象的函数。

SamodelConverter类

SAModelConverter类从sqlalchemy模型创建转换器。除非在类的IGNORES成员中指定,否则将转换模型的列。

class Test(Base):
    __tablename__ = 'test'
    a = Column(Integer, primary_key=True)
    b = Column(Integer)
    c = Column(Integer)
    d = Column(Integer)

@myrepo.register(Test)
class TestModelConverter(SAModelConverter):
    IGNORES = ('c', 'd')    # ommit Test.c and Test.d

repository.fromSqlAlchemyModel(模型,attrs=none,忽略=none)

另一种注册sqlalchemy模型转换器的方法。除非列的名称在ignore参数中列出,否则将转换模型的列。attrs是键名和attr对象的字典。

# Converts Test model
myrepo.fromSQLAlchemyModel(Test,
    attrs={
        'fld1': attr,           # Emits Test.fld1 as value of 'fld1'
        'X_VALUE':attr('fld_X') # Emits Test.fld_X as value of 'X_VALUE'
    },
    ignores=('fld3', 'fld4')) # ignore Test.fld3 and Test.fld2

djangomodelconverter类

DjangoModelConverter类从django模型创建转换器。除非在类的IGNORES成员中指定,否则将转换模型的列。

class DjangoModel(models.Model):
    charattr = models.CharField(max_length=10)
    intattr = models.IntegerField()

@myrepo.register(DjangoModel)
class TestModelConverter(DjangoModelConverter):
    pass

repository.fromSqlAlchemyModel(模型,attrs=none,忽略=none)

另一种注册django模型转换器的方法。除非列的名称在ignore参数中列出,否则将转换模型的列。attrs是键名和attr对象的字典。

# Converts Test model
myrepo.fromDjangoModel(Test,
    attrs={
        'fld1': attr,           # Emits Test.fld1 as value of 'fld1'
        'X_VALUE':attr('fld_X') # Emits Test.fld_X as value of 'X_VALUE'
    },
    ignores=('fld3', 'fld4')) # ignore Test.fld3 and Test.fld2

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何强制用户在允许访问活动之前处理对话框?我的许可证代码怎么了?   java ArraysList作为JSON   mysql如何在java中创建包含多个可选where子句的搜索语句?   java如何让Apache Camel在“直接”路径的末尾删除文件?   使用socket在两个Androids之间进行java实时数据传输。IO(websocket)和4G   如何在java中实现两个CORBA服务器之间的通信   会话树xml表示为java对象   java Skype4Java编号swtwin323325   java RecyclerView getAdapterPosition()不工作:第一次单击返回正确位置,第二次单击返回1   java在$TOMCAT/conf/context上为JNDI设置资源。xml   java为什么第二个矩形冲突在第一个矩形冲突时不起作用?   JScrollPane上的java JTextArea未出现在JPanel上   java如何将实现的PriorityQueue打印为字符串?   jpa使用Jersey更新用户角色RESTJava(JAXRS)