可扩展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
```
我们需要在不同的系统之间交换数据,用不同的语言和技术实现。
即使在同一个系统中,当在
后端和前端之间实现数据交换时,我们也要面对需要将语言数据
类型转换为另一种格式,然后在数据到达线路的另一端时执行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)
>;
true
```
称为"ejson.loads"。
编写代码以反序列化由"ejson"库序列化的对象应与以下示例一样简单:
``python
person=ejson.loads(http廑response.content)
>;>;IsInstance(person,person)==true
```