json对象映射器/编码器
Medea的Python项目详细描述
用于将json映射到python对象和从python对象映射json的简单实用程序。
美地亚
medea是一个用于json编码的单分派函数。
列表、元组和序列转换为列表。 dict的项和值是递归调度的。 其他类型应在调度功能中注册。
medea.register(date,lambdaobj:obj.strftime('%Y-%m-%d'))dob=date(1974,3,1)assertmedea(dob)=='1974-03-01'bob={'name':'Bob','age':38,'colors':('blue','red'),'dob':dob}assertmedea(bob)=={'name':'Bob','age':38,'colors':['blue','red'],'dob':'1974-03-01'}
可以向映射器注册自定义对象:
classPet(object):passclassDog(Pet):def__init__(self,name):self.name=nameself.kind='Dog'classCat(Pet):def__init__(self,name):self.name=nameself.kind='Cat'classPetPerson(Person):passmedea.register(PetPerson,MedeaCamelMapper('first_name','last_name','pets'))medea.register(Pet,MedeaCamelMapper('name','kind'))anne=PetPerson('Anne','Frank')fido=Dog('Fido')spot=Dog('Spot')garfield=Cat('Garfield')anne.pets=[fido,spot,garfield]assertmedea(anne)=={'firstName':'Anne','lastName':'Frank','pets':[{'kind':'Dog','name':'Fido'},{'kind':'Dog','name':'Spot'},{'kind':'Cat','name':'Garfield'}]}
medea编码器
medeacoder是一个使用medea函数的jsonencoder。
medeamapper
使用python属性名作为参数创建映射器。属性是 未白名单将不会序列化:
classPerson(object):def__init__(self,first_name,last_name,address='',phone_number='',dob=''):self.first_name=first_nameself.last_name=last_nameself.address=addressself.phone_number=phone_numberself.dob=dobbob=Person('Bob','Hope','123 Main','123','1903-05-29')mapper=MedeaMapper('first_name','last_name','address','phone_number','dob')bob_json={'first_name':'Bob','last_name':'Hope','address':'123 Main','phone_number':'123','dob':'1903-05-29'}assertmapper.to_json(bob)==bob_json
可以使用**kwargs覆盖属性名。
bob=Person('Bob','Hope','123 Main','123','1903-05-29')mapper=MedeaMapper('address','dob',first_name='firstName',last_name='lastName')bob_json={'firstName':'Bob','lastName':'Hope','address':'123 Main','dob':'1903-05-29'}assertmapper.to_json(bob)==bob_json
如果json是驼峰大小写,medecamelmapper可能很有用。
bob=Person('Bob','Hope','123 Main','123','1903-05-29')mapper=MedeaCamelMapper('first_name','last_name','address','phone_number','dob')bob_json={'firstName':'Bob','lastName':'Hope','address':'123 Main','phoneNumber':'123','dob':'1903-05-29'}assertmapper.to_json(bob)==bob_json
映射器还可以将属性从json映射到对象:
bob=Person('Bob','Hope','123 Main','123','1903-05-29')bob_json_full={'firstName':'Bob','lastName':'Hope','address':'123 Main','phoneNumber':'123','DOB':'1903-05-29'}fred_json={'firstName':'Fred','lastName':'Rodgers'}mapper=MedeaCamelMapper('first_name','last_name')mapper_full=MedeaCamelMapper('first_name','last_name','address','phone_number',dob='DOB')assertmapper.to_json(bob)==bob_jsonassertmapper_full.to_json(bob)==bob_json_full# Override Bob's name from Fredmapper.from_json(fred_json,bob)# Mapper only serializes namesassertmapper.to_json(bob)==fred_jsonassertmapper_full.to_json(bob)!=bob_json_fullassertbob.first_name=='Fred'assertbob.last_name=='Rodgers'assertbob.address=='123 Main'assertbob.phone_number=='123'assertbob.dob=='1903-05-29'# Revert back to Bob's namemapper.from_json(bob_json,bob)assertmapper.to_json(bob)==bob_jsonassertmapper_full.to_json(bob)==bob_json_full