可扩展JSon Serializer/Desarraizer Library

ejson的Python项目详细描述


#可扩展的序列化规范


我们需要在不同的系统之间交换数据,用不同的语言和技术实现。
即使在同一个系统中,当在
后端和前端之间实现数据交换时,我们也要面对需要将语言数据
类型转换为另一种格式,然后在数据到达线路的另一端时执行oposite。


一种非常简单和灵活的格式,似乎适合我们的大多数需要,它是javascript对象表示法,或简单的"json"。现在很难找到一种不支持它的编程语言,即使是
低级的,如C、C++等。当我们需要交换整数、BR/>加倍、字符串、列表和哈希表等数据类型时,BR/> BR/> JSON就足够了。当我们需要
来交换复杂的数据类型时,问题就开始了。这个
文档的确切目的是:提供一个扩展"json"库的api,使注册新的序列化程序和反序列化程序变得容易


了解如何识别复杂python
对象的类型。让我们从基本的开始。数字"1"只是内置类"int"的
实例。字面上的"stuff"被翻译成类似"str("stuff")"的东西,是
"str"类的一个实例。列表和字典是一样的:

`` python
mylist=[1,2,3]
isinstance(mylist,list)是的,它是list类的一个实例
mydict={"a":1,"b":2}
isinstance(mydict,dict)还有,这是dict类的一个实例,但是自制类呢?就像这样:

`` python
类(对象):
def\uu init\uu(self):
self.myint=42
self.mystr="没什么特别的"
self.mylist=[self.myint,self.mystr]
``

我们知道,python类也是*python*类型*。所以,如果您创建了一个新的"a()"实例,比如说:`a=a()`。可以说
"a"变量的类型是"a",就像"1"的类型是
"int"。换句话说,如果实例类型等于给定的类型/类,那么内置函数'is instance()'将告诉
您。


但它不理解复杂的类型。您是否尝试用'json'库转储
`datetime.datetime`实例?以下是您得到的结果:


```
回溯(最近一次调用):
file"<;stdin>;",第1行,in<;module>;
(…)
file"../encoder.py"
raise typeerror(repr(o)+"不是json可序列化的")
typeerror:datetime.datetime(2012,8,22,12,19,12,577078)json不是可序列化的,因为json库不知道如何处理这些对象。一个简单的解决方法是这样做:

`` python
>;>import json
>;>def converter(val):
…如果IsInstance(Val,DateTime):
…返回值isoformat()
…raise typeerror

>;>date=datetime(2012,8,22,12,23)
>;>json.dumps({a':'b','b':date},default=converter)
{"a":"b","b":"2012-08-22t12:23:00"}
````

对于您愿意在系统中支持的所有类型,此规范建议引入一个api
来注册类型及其处理程序。首先,我们声明一个名为
`person`的复杂类型。第二步是让"ejson"库知道如何序列化该类的对象。为此,您需要
注册一个意甲联赛利泽看一看完整的例子:

`` python
>;>>类人员(对象):
…定义初始(自我、姓名、年龄、性别):
…self.name=姓名
…self.age=年龄
…self.gender=gender

>;>import ejson
>;@ejson.register_serializer(person)
…def serialize_person(实例):
…返回{
…'名称:instance.name,
…age":实例.age,
…性别:实例。性别,
…}

>;>Ejson导入转储
>;>dumps(person('Lincoln',25,'Male'))
'{"{"{"Stadymark.core.person","{"gender":"Male","age":25,"name":"lincoln"}'
````

\我们还将指向构建实例的工厂的虚线路径添加到自定义的dumps()函数返回的json信息中。


注册序列化程序的帮助。但是,如果在从
连线接收到对象的json描述之后需要
来反序列化该对象,会发生什么情况?

很难猜测带有"name"、"age"和
"gender"键的字典是"person"实例。为了使处理
这个场景更加容易,这个规范建议引入
反序列化程序的注册表和检索它们的简单方法。因此,如果您正在编写一个需要处理字段的组件,并且您确信
代表一个"person",那么您可以这样做:

``python
>;>import ejson
>;>import json
>;
>;>class person(object):
…定义初始(自我、姓名、年龄、性别):
…self.name=姓名
…self.age=年龄
…self.gender=性别

>;@ejson.register_deserializer(person)
…def反序列化个人(数据):
…返回person(data['name',data['age',data['gender'])

>;
>;>import ejson
>;>content='{"gender":"male","age":25,"name":"lincoln"}
>;>obj=json.loads(content)
>;>;>;>isInstance(person,person)
true
```

称为"ejson.loads"。
编写代码以反序列化由"ejson"库序列化的对象应与以下示例一样简单:

``python
person=ejson.loads(http廑response.content)
>;>;IsInstance(person,person)==true
```

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

推荐PyPI第三方库


热门话题
如果SQL server执行计划是流式传输数据,那么调用next()时Java ResultSet对象将如何反应?   java为什么水平滚动条永远不会出现在JTable上?   java如何在Android项目中添加SDK模块   绿脚:爪哇。lang.ClassCastException:无法将障碍物投射到球投射物   xslt需要在Java1.4.2中使用SaxonB(版本9.1.0.8)方面的帮助   java Apache HTTP客户端下载SOAP响应的一部分   为Java 9计划的“过滤传入序列化数据”解决了数据反序列化安全漏洞吗?   java如何使用drools对列表中的元素进行分组   java从匿名类到lambda表达式   Java中是否有不可变的单链表实现?   java动态添加按钮以滚动查看安卓   java GAE:无法为模块http请求设置管理员登录凭据   java如何在Hibernate 5 CriteriaBuilder中使用条件条件获取计数   java如何将JSON+HAL响应解析为POJO   java如何获取计算器程序,对两个以上的数字进行加、减、乘、除   java Thymeleaf+静态资源+@ResponseBody