具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
本发明实施例提供了一种对象反序列化装置,该装置可以通过计算机设备实现其功能。
图1是根据本发明第一实施例的对象反序列化装置的结构示意图。如图1所示,该对象反序列化装置包括第一获取单元10、创建单元20、转化单元30和生成单元40。
第一获取单元10用于获取目标字符串。
该目标字符串中包含有进行反序列化生成的对像的键属性,例如,当对像为书籍,其具有的属性包括书籍编号、作者、出版社和备注等,将该书籍进行序列化后,生成有与该书籍对应的Json字符串,该Json字符串具有与书籍的属性相对应的属性值。获取目标字符串以便于将该目标字符串进行反序列化。
Json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
对象:对象在javascript中表示为“{}”扩起来的内容,数据结构为{key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象。key获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
数组:数组在javascript中是中括号“[]”扩起来的内容,数据结构为["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
创建单元20用于创建与目标字符串对应的Json对象,Json对象为具有Json属性的设置操作的类。
Json对象中具有将Json字符串生成其对应的对象的方法。该Json对象可以是用于提供判断键属性是否存在的方法和通过属性名称获取指定类型值的方法的类。例如,当判断对象为书籍时,Json对象可以用于判断其出版社这一属性对应的键属性是否存在,并获取该属性对应的类型值。这里的类(Class)是面向对象程序设计语言中的一个概念。实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。一个类定义了一组对象。类具有行为(be-havoir),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。
类实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。类通过接口与外界发生关系。
可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相同的成员:属性、方法和事件。但是,每个对象都像一个独立的实体一样动作。例如,一个对象的属性可以设置成与同类型的其他对象不同的值(value)。
转化单元30用于将目标字符串转化为Json对象。
由于Json对象具有将Json字符串生成其对应的对象的方法,Json对象封装了Json字符串的处理过程,将目标字符串转化为Json对象,以便于通过Json对象生成与目标字符串的对象。目标字符串的对象即为目标字符串对应的目标对象。
生成单元40用于由Json对象生成目标字符串的对象。
其中Json对象为目标字符串对应的Json对象,且Json对象封装了Json字符串的处理过程,因此由Json对象可以生成目标字符串的对象,从而实现目标字符串的反序列化。
根据本发明实施例,通过创建与目标字符串对应的Json对象,并将目标字符串转化为该Json对象,由Json对象生成目标字符串的对象,从而实现对目标字符串的反序列化,由于将Json字符串转化为一个标准的Json对象,从而不会因为Json字符串内容与目标对象不匹配而导致的反序列化失败,克服了语言框架自带的无法反序列化Json字符串的问题。
优选地,Json对象用于提供判断目标字符串的键属性是否存在的判断依据,对象反序列化装置还包括判断单元,该判断单元用于在创建与目标字符串对应的Json对象之后,通过Json对象判断目标字符串的键属性是否存在。
由于将目标字符串进行反序列化时,需要获取目标字符串的对象的所有属性值,以对目标字符串进行反序列化生成目标字符串的对象。当创建与目标字符串对应的Json对象之后,需要Json对象通过判断目标字符串键属性是否存在,例如,当对象为书籍时,需要判断书籍对应的书籍编号、作者、出版社和备注等属性在Json字符串中的属性值是否存在。
由于Json字符串的数据提供者与反序列化的开发者不同,当数据提供者将Json字符串的数据进行升级时,例如:增加/减少Json字符串对应的对象的属性,或者更改其数据类型,那么反序列化的开发者使用传统手动方式解析极有可能导致解析失败,本装置通过判断属性存在和类型检测仍然可以保持反序列化的兼容性。
属性是实体的描述性性质或特征,具有数据类型、域、默认值三种性质。属性也往往用于对控件特性的描述。对于按钮控件的名称、显示的文字、背景色,背景图片等等。大多数控件都具有的属性称为公共属性:名称、标题、背景色、前景色等等。
优选地,Json对象用于提供通过目标字符串的属性名称获取指定类型值的依据,对象反序列化装置还包括第二获取单元,该第二获取单元用于在创建与目标字符串对应的Json对象之后,Json对象通过目标字符串的属性名称获取指定类型值。
目标字符串的属性名称对应着目标字符串的对象的属性,例如,当对象为书籍时,其具有书籍编号、作者、出版社和备注等属性在Json字符串中包含有相应的属性名称“ISBN”、“Author”、“Publisher”、“Remarks”等。指定类型值即各属性名称相应的具有特定类型的值。通过获取指定类型值用以生成目标字符串的对象。
图2是根据本发明第二实施例的对象反序列化装置的结构示意图。该实施例的对象反序列化装置可以作为上述实施例的对象反序列化装置的一种优选实施方式。如图3所示,该对象反序列化装置包括第一获取单元10、创建单元20、转化单元30和生成单元40,其中,创建单元20包括:第一获取模块201、第二获取模块202、第三获取模块203和第一创建模块204。第一获取单元10、转化单元30和生成单元40与图1所示的第一获取单元10、转化单元30和生成单元40功能相同,这里不做赘述。
第一获取模块201用于获取目标字符串对应的数组。
所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。在目标字符串中可以存在有以数组形式存在的对象的属性值,因此创建Json对象同时,创建一个可选的Json数组的类,可以用于通过索引获取数组中的值。
第二获取模块202用于获取数组的索引。
该索引用于索引数组中的值,以便于准确定位到数组中的值并获取该数组中的值。
第三获取模块203用于通过索引获取数组中的值。
当索引到该数组中的值后,获取该数组的值。由于数组中的值对应有对象的属性,便于创建相应的Json对象,最后完成目标字符串的反序列化。
第一创建模块204用于通过数组中的值创建与目标字符串对应的Json对象。
由于数组中的值对应有对象的属性,因此创建后的Json对象具有与目标字符串相应的属性。创建的Json数组继承Json对象,可以根据数组中的值创建Json数组以创建与目标字符串对应的Json对象。
优选地,创建单元20包括第二创建模块,用于创建一个测试类,测试类为书籍类对象,书籍类对象包含多个属性。
创建一个测试类(书籍Book类),Book类包含了几个属性,如整数的ID为标识,书籍编号ISBN,作者Author、出版社Publisher、备注Remarks均为字符串,和一个时间类型的出版日期PublishDate。由于计算机开发语言不同,实现方式不同,我们仅以C#为例,其中,将“Json对象”命名为JsonObject,将“Json数组”命名为JsonArray。在该实施例中,创建的测试类如下:
生成单元40包括转化模块和生成模块。转化模块用于序列化预先设置的Json字符串,将Json字符串反序列化为书籍类对象。如{"ID":1,"ISBN":"000-0-0000-0000-0","Author":"XXX","PublishDate":"1999-9-9","Publisher":"XXX"}。
生成模块用于通过书籍类对象生成目标字符串的对象。
通过Json对象构建目标对象Book:
JsonObject jo=JsonObject.Parse("{\"ID\":1,\"ISBN\":\"000-0-0000-0000-0\","Author\":\"XXX\",\"PublishDate\":\"1999-9-9\",\"Publisher\":\"XXX\"}");
Book book=new Book();
book.ID=jo.GetInt("ID");
book.ISBN=jo.GetString("ISBN");
book.Author=jo.GetString("Author");
book.PublishDate=jo.GetDate("PublishDate");
book.Publisher=jo.GetString("Publisher");
if(jo.Has("Remarks"))book.Remarks=jo.GetString("Remarks");
对于复杂对象的序列化,数组、Json对象在JsonObject可以通过GetArray和GetObject来获取。
对象反序列化装置还包括操作单元,该操作单元用于由Json对象生成目标字符串的对象之后,通过Json对象对目标字符串完成反序列化操作。
根据本发明实施例,Json对象封装了Json字符串的处理过程,开发者不必了解Json格式,也无需处理复杂的字符串解析,开发者仅需要了解面向对象的概念即可完成反序列化,大大降低了开发的复杂度,降低出错概率,节省了开发者时间。其中,封装是指隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
本发明实施例还提供了一种对象反序列化方法。该方法运行在计算机设备上。需要说明的是,本发明实施例的对象反序列化方法可以通过本发明实施例所提供的对象反序列化装置来执行,本发明实施例的对象反序列化装置也可以用于执行本发明实施例所提供的对象反序列化方法。
图3是根据本发明第一实施例的对象反序列化方法的流程图。如图3所示,该对象反序列化方法包括步骤如下:
步骤S101,获取目标字符串。该目标字符串为Json字符串,可以是任意的需要进行反序列化的Json字符串。该目标字符串中包含有进行反序列化生成的对像的键属性,例如,当对像为书籍,其具有的属性包括书籍编号、作者、出版社和备注等,将该书籍进行序列化后,生成有与该书籍对应的Json字符串,该Json字符串具有与书籍的属性相对应的属性值。获取目标字符串以便于将该目标字符串进行反序列化。
Json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
对象:对象在javascript中表示为“{}”扩起来的内容,数据结构为{key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象。key获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
数组:数组在javascript中是中括号“[]”扩起来的内容,数据结构为["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
步骤S102,创建与目标字符串对应的Json对象,Json对象为具有Json属性的设置操作的类。Json对象中具有将Json字符串生成其对应的对象的方法。该Json对象可以是用于提供判断键属性是否存在的方法和通过属性名称获取指定类型值的方法的类。例如,当判断对象为书籍时,Json对象可以用于判断其出版社这一属性对应的键属性是否存在,并获取该属性对应的类型值。这里的类(Class)是面向对象程序设计语言中的一个概念。实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。一个类定义了一组对象。类具有行为(be-havoir),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。
类实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。类通过接口与外界发生关系。
可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相同的成员:属性、方法和事件。但是,每个对象都像一个独立的实体一样动作。例如,一个对象的属性可以设置成与同类型的其他对象不同的值(value)。
步骤S103,将目标字符串转化为Json对象。由于Json对象具有将Json字符串生成其对应的对象的方法,Json对象封装了Json字符串的处理过程,将目标字符串转化为Json对象,以便于通过Json对象生成与目标字符串的对象。目标字符串的对象即为目标字符串对应的目标对象。
步骤S104,由Json对象生成目标字符串的对象。其中Json对象为目标字符串对应的Json对象,且Json对象封装了Json字符串的处理过程,因此由Json对象可以生成目标字符串的对象,从而实现目标字符串的反序列化。
根据本发明实施例,通过创建与目标字符串对应的Json对象,并将目标字符串转化为该Json对象,由Json对象生成目标字符串的对象,从而实现对目标字符串的反序列化,由于将Json字符串转化为一个标准的Json对象,从而不会因为Json字符串内容与目标对象不匹配而导致的反序列化失败,克服了语言框架自带的无法反序列化Json字符串的问题。
优选地,Json对象用于提供判断目标字符串的键属性是否存在的判断依据,在步骤102之后,对象反序列化方法还包括:
步骤5,通过Json对象判断目标字符串的键属性是否存在。由于将目标字符串进行反序列化时,需要获取目标字符串的对象的所有属性值,以对目标字符串进行反序列化生成目标字符串的对象。当创建与目标字符串对应的Json对象之后,需要Json对象通过判断目标字符串键属性是否存在,例如,当对象为书籍时,需要判断书籍对应的书籍编号、作者、出版社和备注等属性在Json字符串中的属性值是否存在。
由于Json字符串的数据提供者与反序列化的开发者不同,当数据提供者将Json字符串的数据进行升级时,例如:增加/减少Json字符串对应的对象的属性,或者更改其数据类型,那么反序列化的开发者使用传统手动方式解析极有可能导致解析失败,本装置通过判断属性存在和类型检测仍然可以保持反序列化的兼容性。
属性是实体的描述性性质或特征,具有数据类型、域、默认值三种性质。属性也往往用于对控件特性的描述。对于按钮控件的名称、显示的文字、背景色,背景图片等等。大多数控件都具有的属性称为公共属性:名称、标题、背景色、前景色等等。
优选地,Json对象用于提供通过目标字符串的属性名称获取指定类型值的依据,在步骤102之后,对象反序列化方法还包括:
步骤S6,Json对象通过目标字符串的属性名称获取指定类型值。目标字符串的属性名称对应着目标字符串的对象的属性,例如,当对象为书籍时,其具有书籍编号、作者、出版社和备注等属性在Json字符串中包含有相应的属性名称“ISBN”、“Author”、“Publisher”、“Remarks”等。指定类型值即各属性名称相应的具有特定类型的值。通过获取指定类型值用以生成目标字符串的对象。
图4是根据本发明第二实施例的对象反序列化方法的流程图。该实施例的对象反序列化方法可以作为上述实施例的对象反序列化方法一种优选实施方式。如图4所示,该对象反序列化方法包括步骤如下:
步骤S201,获取目标字符串。该目标字符串为Json字符串,可以是任意的需要进行反序列化的Json字符串。该目标字符串中包含有进行反序列化生成的对像的键属性,例如,当对像为书籍,其具有的属性包括书籍编号、作者、出版社和备注等,将该书籍进行序列化后,生成有与该书籍对应的Json字符串,该Json字符串具有与书籍的属性相对应的属性值。获取目标字符串以便于将该目标字符串进行反序列化。
步骤S202,获取目标字符串对应的数组。所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。在目标字符串中可以存在有以数组形式存在的对象的属性值,因此创建Json对象同时,创建一个可选的Json数组的类,可以用于通过索引获取数组中的值。
步骤S203,获取数组的索引。该索引用于索引数组中的值,以便于准确定位到数组中的值并获取该数组中的值。
步骤S204,通过索引获取数组中的值。当索引到该数组中的值后,获取该数组的值。由于数组中的值对应有对象的属性,便于创建相应的Json对象,最后完成目标字符串的反序列化。
步骤S205,通过数组中的值创建与目标字符串对应的Json对象。由于数组中的值对应有对象的属性,因此创建后的Json对象具有与目标字符串相应的属性。创建的Json数组继承Json对象,可以根据数组中的值创建Json数组以创建与目标字符串对应的Json对象。
步骤S206,将目标字符串转化为Json对象。由于Json对象具有将Json字符串生成其对应的对象的方法,Json对象封装了Json字符串的处理过程,将目标字符串转化为Json对象,以便于通过Json对象生成与目标字符串的对象。目标字符串的对象即为目标字符串对应的目标对象。
步骤S207,由Json对象生成目标字符串的对象。其中Json对象为目标字符串对应的Json对象,且Json对象封装了Json字符串的处理过程,因此由Json对象可以生成目标字符串的对象,从而实现目标字符串的反序列化。
根据本发明实施例,通过创建一个Json数组,以方便对目标字符串中的数组进行反序列化的。
图5是根据本发明第三实施例的对象反序列化方法的流程图。该实施例的对象反序列化方法可以作为上述实施例的一种优选实施方式。如图5所示,该对象反序列化方法包括步骤如下:
步骤S301,获取目标字符串。该目标字符串为Json字符串,可以是任意的需要进行反序列化的Json字符串。该目标字符串中包含有进行反序列化生成的对像的键属性,例如,当对像为书籍,其具有的属性包括书籍编号、作者、出版社和备注等,将该书籍进行序列化后,生成有与该书籍对应的Json字符串,该Json字符串具有与书籍的属性相对应的属性值。获取目标字符串以便于将该目标字符串进行反序列化。
步骤S302,创建一个测试类,测试类为书籍类对象,书籍类对象包含多个属性。创建一个测试类(书籍Book类),Book类包含了几个属性,如整数的ID为标识,书籍编号ISBN,作者Author、出版社Publisher、备注Remarks均为字符串,和一个时间类型的出版日期PublishDate。由于计算机开发语言不同,实现方式不同,我们仅以C#为例,其中,将“Json对象”命名为JsonObject,将“Json数组”命名为JsonArray。在该实施例中,创建的测试类如下:
步骤S303,序列化预先设置的Json字符串,将Json字符串反序列化为书籍类对象。如{"ID":1,"ISBN":"000-0-0000-0000-0","Author":"XXX","PublishDate":"1999-9-9","Publisher":"XXX"}。
步骤S304,通过书籍类对象生成目标字符串的对象。通过Json对象构建目标对象Book:
JsonObject jo=JsonObject.Parse("{\"ID\":1,\"ISBN\":\"000-0-0000-0000-0\","Author\":\"XXX\",\"PublishDate\":\"1999-9-9\",\"Publisher\":\"XXX\"}");
Book book=new Book();
book.ID=jo.GetInt("ID");
book.ISBN=jo.GetString("ISBN");
book.Author=jo.GetString("Author");
book.PublishDate=jo.GetDate("PublishDate");
book.Publisher=jo.GetString("Publisher");
if(jo.Has("Remarks"))book.Remarks=jo.GetString("Remarks");
对于复杂对象的序列化,数组、Json对象在JsonObject可以通过GetArray和GetObject来获取。
步骤S305,由Json对象生成目标字符串的对象。其中Json对象为目标字符串对应的Json对象,且Json对象封装了Json字符串的处理过程,因此由Json对象可以生成目标字符串的对象,从而实现目标字符串的反序列化。
步骤S306,通过Json对象对目标字符串完成反序列化操作。
根据本发明实施例,Json对象封装了Json字符串的处理过程,开发者不必了解Json格式,也无需处理复杂的字符串解析,开发者仅需要了解面向对象的概念即可完成反序列化,大大降低了开发的复杂度,降低出错概率,节省了开发者时间。其中,封装是指隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
需要说明的是,本发明实施例的对象反序列化方法和装置可以用于任何面向对象编程语言,本实施例中仅以C#语言进行举例说明,并不对本发明实施例有不当限定。
另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。