schemaconvertor提供了一种使用schema来转换对象的方法,通过schema,可以指定该对象序列化的部分和对应的类型,其结果可以进一步序列化为json。
安装:pip install schemaconvertor
版本:0.3
假设有个简单的数据类型User
:
from collections import namedtuple
User = namedtuple("User", ["name", "password", "age"])
可以通过指定schema来转换对象:
schema = {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
}
}
}
user = User(name="lyc", password="schemaconvertor", age="24")
from schemaconvertor.convertor import convert_by_schema
print convert_by_schema(user, schema)
输出:
{'age': 24, 'name': 'lyc'}
更多示例:demo 0.3
version字段标识着Schema版本。
description字段标识着Schema说明。
encoding指定Schema的string字段的字符编码,默认是utf-8。
decoderrors指定Schema的string字段解码失败的操作,用于str.decode
的第二个参数,主要有strict,ignore,replace三种可选参数,默认是strict
。
type字段指定对应待转换数据的最终类型,主要类型对应如下表:
type | Python |
---|---|
string | unicode |
object | dict |
integer | int |
float | float |
number | int/float |
boolean | bool |
dict | dict |
array | list |
null | NoneType |
raw | object |
type字段直接影响转换行为,因此基本上每个Schema都需指定type,为简化表达,当一个Schema仅有type一项时,可以直接使用type的值简化表示为Schema。
当前仅在声明typeOf字段时可以不指定type,typeOf指示如何根据数据的类型选择对应的Schema。可以使用真实的Python类型或类型元组作为key(作为isinstance
的第二个参数)。
default字段仅用在typeOf字段内,用于指示缺省类型表示的Schema。
items字段仅在type为array时生效,用于描述序列中的每一项对应的Schema。
properties字段仅在type为dict或object时生效,指定给出的项的Schema(没有指定的项不会处理)。
patternProperties字段仅在type为dict或object时生效,指定符合给定的正则表达式的项的Schema(使用re.search
匹配)。
- Schema使用lazy compile方式,仅在转换使用时自动编译,初始化代价极小。
- 子Schema中如无显式声明,version,description,encoding,decoderrors自动继承父Schema对应的值。
- typeOf能够识别继承关系,但针对使用数据真实类型的情况有优化。
- typeOf指定多种类型时不要使用
list
等非hashable类型。 - 对于object的情况是使用
ObjAsDictAdapter
将数据包装成类dict
对象进行转换的。