反序列化方法及装置与流程

文档序号:17261766发布日期:2019-03-30 09:42阅读:281来源:国知局
反序列化方法及装置与流程

本发明涉及数据处理技术领域,特别是涉及一种反序列化方法及装置。



背景技术:

随着互联网技术的日益发展,不同应用系统之间的信息交互变得更加频繁。由于开发不同应用系统时,所使用的编程语言各不相同,因此不同应用系统之间进行信息交互时,需要将待传输的对象转换为一种通用的数据格式,然后再进行数据传输。由于json(javascriptobjectnotation,javascript对象表示法)结构是一种完全独立于编程语言的轻量级数据交换格式,因此使用json结构作为不同应用系统之间数据传输的传输载体有很大优势。

目前,在两个不同应用系统之间进行信息交互的过程中,当使用json结构作为传输载体时,通常是在一个应用系统的api(applicationprograminterface,应用程序接口)中将待传输对象序列化为json结构的字符串,然后将该json字符串发送至另一个应用系统的api中,并将该json字符串反序列化为该应用系统所使用的编程语言对应的对象。

发明人在实现上述发明过程中,发现现有技术中在将json字符串反序列化为java对象的过程中,当json字符串包含的多个字段中,有至少两个字段对应的数据内容的原始数据类型为数值类型时,需要确定多个数据内容中数据精度最高的数据内容,然后按照这个数据内容对应的数值类型对这个json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,从而导致反序列化得到的java对象中一些数值类型的数据内容的数据精度发生改变,因此,通过现有技术将json字符串反序列化为java对象会导致反序列化得到的java对象的数据精度往往无法满足实际需要。



技术实现要素:

有鉴于此,本发明提供的反序列化方法及装置,主要目的在于克服在将json字符串反序列化为java对象的过程中,按照数据精度最高的数据内容对应的数值类型对json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,导致反序列化得到的java对象中一些数据内容的数据精度发生改变的问题,从而提高了反序列化得到的java对象的准确率。

为了解决上述问题,本发明主要提供如下技术方案:

第一方面,本发明提供了一种反序列化方法,该方法包括:

接收json字符串;

解析所述json字符串,得到解析结果,其中,所述解析结果中包含多个字段,每个所述字段包括:字段名称及对应的数据内容;

确定每个字段名称对应的数据内容的原始数据类型,并判断所述数据内容中是否包含至少两个原始数据类型为数值类型的数据内容;

若是,则按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象。

可选的,确定每个字段名称对应的数据内容的原始数据类型包括:

采用解析代码识别所述每个字段名称对应的数据内容;

判断所述数据内容是否为数值型数据;

若是,则确定所述数据内容对应的数据精度,并根据所述数据精度确定所述数据内容对应的原始数据类型。

可选的,按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象包括:

逐一获取所述解析结果中包含的每个数据内容及所述每个数据内容对应的原始数据类型;

按照所述每个数据内容对应的原始数据类型,依次对所述每个数据内容进行转换操作,生成所述java对象。

可选的,所述数值型数据的类型包括:int型、long型、float型、double型。

可选的,在接收json字符串之前,所述方法还包括:

在数据传输接口中布署解析代码,其中,所述数据传输接口用于接收所述json字符串,所述解析代码用于解析所述json字符串,以获得所述json字符串中每个字段包括的字段名称及对应的数据内容。

可选的,所述方法还包括:

将所述每个字段名称与对应的原始数据类型的映射关系进行缓存;

当所述数据传输接口接收到与所述json字符串结构相同的json字符串时,从缓存中获取所述结构相同的json字符串包含的每个字段名称对应的数据内容的原始数据类型,以便按照每个数据内容对应的原始数据类型分别将所述结构相同的json字符串转换为java对象。

第二方面,本发明还提供一种反序列化装置,该装置包括:

接收单元,用于接收json字符串;

解析单元,用于解析所述接收单元接收的所述json字符串,得到解析结果,其中,所述解析结果中包含多个字段,每个所述字段包括:字段名称及对应的数据内容;

确定单元,用于确定所述解析单元解析得到的每个字段名称对应的数据内容的原始数据类型;

判断单元,用于判断所述数据内容中是否包含至少两个原始数据类型为数值类型的数据内容;

转换单元,用于当所述判断单元判断所述数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象。

可选的,所述确定单元包括:

识别模块,用于采用解析代码识别所述每个字段名称对应的数据内容;

判断模块,用于判断所述识别模块识别的所述数据内容是否为数值型数据;

确定模块,用于当所述判断模块判断所述数据内容为数值型数据时,确定所述数据内容对应的数据精度,并根据所述数据精度确定所述数据内容对应的原始数据类型。

可选的,所述转换单元包括:

获取模块,用于逐一获取所述解析结果中包含的每个数据内容及所述每个数据内容对应的原始数据类型;

生成模块,用于按照所述获取模块获取的所述每个数据内容对应的原始数据类型,依次对所述每个数据内容进行转换操作,生成所述java对象。

可选的,所述数值型数据的类型包括:int型、long型、float型、double型。

可选的,所述装置还包括:

布署单元,用于在数据传输接口中布署解析代码,其中,所述数据传输接口用于接收所述json字符串,所述解析代码用于解析所述json字符串,以获得所述json字符串中每个字段包括的字段名称及对应的数据内容。

可选的,所述装置还包括:

缓存单元,用于将所述每个字段名称与对应的原始数据类型的映射关系进行缓存;

获取单元,用于当所述数据传输接口接收到与所述json字符串结构相同的json字符串时,从缓存中获取所述缓存单元缓存的所述结构相同的json字符串包含的每个字段名称对应的数据内容的原始数据类型,以便按照每个数据内容对应的原始数据类型分别将所述结构相同的json字符串转换为java对象。

为了实现上述目的,根据本发明的第三方面,提供了一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述所述的反序列化方法。

为了实现上述目的,根据本发明的第四方面,提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述所述的反序列化方法。

借由上述技术方案,本发明提供的技术方案至少具有下列优点:

本发明提供的一种反序列化方法及装置,本发明能够在解析接收到的json字符串之后,根据解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容,并确定每个字段名称对应的数据内容的原始数据类型,当经过判断该json字符串中包含的所有数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,将该json字符串转换为java对象,与现有技术中按照json字符串中数据精度最高的数据内容对应的数值类型,对json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,将json字符串转换为java对象相比,本发明可以保证经过反序列化操作得到的java对象中的数值类型的数据内容的数据精度与json字符串中对应的数据内容的数据精度一致,从而提高了反序列化得到的java对象的准确率。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了本发明实施例提供的一种反序列化方法流程图;

图2示出了本发明实施例提供的另一种反序列化方法流程图;

图3示出了本发明实施例提供的一种反序列化装置的组成框图;

图4示出了本发明实施例提供的另一种反序列化装置的组成框图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。

本发明实施例提供了一种反序列化方法,如图1所示,该方法在解析接收到的json字符串之后,根据解析结果确定json字符串中包含的每个字段对应的数据内容的原始数据类型,并按照每个数据内容对应的原始数据类型对每个数据内容进行反序列化操作,,将json字符串转换为java对象,提高了反序列化得到的java对象的准确率,该方法包括:

101、接收json字符串。

其中,在两个由不同编程语言开发的应用系统之间进行信息交互时,不能直接将待传输的对象从一个应用系统发送到另外一个应用系统中,需要将待传输的对象转换为一种通用的数据格式,然后再进行数据传输。json(javascriptobjectnotation,javascript对象表示法)字符串为以json结构存储数据的字符串,由于json结构是一种完全独立于编程语言的轻量级数据交换格式,因此使用json字符串作为数据传输的传输载体,能够满足在两个不同应用系统之间进行信息交互。其中,一个json字符串以“{”(左括号)开始、以“}”(右括号)结束,在json字符串中包含多个无序排列的字段,每个字段均由字段名称以及该字段名称对应的数据内容组成,以“名称/数据内容”的形式来表达,字段名称和该字段名称对应的数据内容之间用“:”来分隔,多个字段之间用“,”来分隔,例如,一个json字符串可以为“{name1:value1,name2:value2,name3:value3}”。其中,字段名称对应的数据可以为字符串、数值、对象、布尔值、null值或者数组。

在本发明实施例中,在两个由不同编程语言开发的应用系统之间进行信息交互时,当一个应用系统将待传输对象转换为json字符串,并向另外一个应用系统发送该json字符串时,另外一个应用系统会接收得到该json字符串。

102、解析json字符串,得到解析结果。

其中,解析结果中包含多个字段,每个字段包括:字段名称及对应的数据内容。

在本发明实施例中,当应用系统接收到其他应用系统发送的json字符串后,并不能直接确定该json中包含的具体内容,需要对该json字符串进行解析操作,根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容。

对于本发明实施例,具体应用场景可以如下所示,但不限于此包括:

应用系统a与应用系统b之间进行信息交互,第一次应用系统a将json字符串1发送至应用系统b中,应用系统b接收得到json字符串1,并解析json字符串1,从而根据解析结果确定json字符串1中包含的每个字段的字段名称以及对应的数据内容。其中,解析json字符串1得到的解析结果为{local:hebei,channel:cctv-1,allpeoplecount:123001,allplaytime:20023.12},根据解析结果确定json字符串1中包含4个字段,分别为字段1:字段名称“local”,对应的数据内容“hebei”;字段2:字段名称“channel”,对应的数据内容“cctv-1”;字段3:字段名称“allpeoplecount”,对应的数据内容“123001”;字段4:字段名称“allplaytime”,对应的数据内容“20023.12”,json字符串1中具体记录的内容为所在地域为河北的用户观看cctv-1的总人数为123001人,观看的总时长为20023.12小时。第二次应用系统a将json字符串2发送至应用系统b中,应用系统b接收得到json字符串2,并解析json字符串2,从而根据解析结果确定json字符串2中包含的每一个字段的字段名称以及对应的数据内容。其中,解析json字符串2得到的解析结果为{local:shandong,channel:cctv-5,allpeoplecount:135002,allplaytime:19073.52},根据解析结果确定json字符串2中包含4个字段,字段1:字段名称“local”,对应的数据数据“shandong”;字段2:字段名称“channel”,对应的数据内容“cctv-5”;字段3:字段名称“allpeoplecount”,对应的数据内容“135002”;字段4:字段名称“allplaytime”,对应的数据内容“19073.52”,json字符串2中具体记录的内容为所在地域为山东的用户观看cctv-5的总人数为135002人,观看的总时长为19073.52小时。

需要进行说明的是,上述实施例提及的json字符串中包含的字段的数量、每一个字段的字段名称以及对应的数据内容仅为便于表达,在实际应用过程中,json字符串中包含的字段数量可以为任意数值、每一个字段的字段名称以及对应的数据内容可以为任意内容。

103、确定每个字段名称对应的数据内容的原始数据类型,并判断数据内容中是否包含至少两个原始数据类型为数值类型的数据内容。

其中,原始数据类型可以包括数值类型、字符串类型、布尔值类型、对象类型、null值类型以及数组数据类型等。其中,根据原始数据类型为数值类型的数据内容的数据精度,可以将数值类型具体分为:int型、long型、float型、double型等,数据精度是指当某个数据内容为具体一个数值时,这个数值的有效位数,对于整数形式的数值而言,有效位数越多代表对应的数据精度越高;对于非整数形式的数值而言,小数点后有效位数越多代表对应的数据精度越高。

在本发明实施例中,在步骤102解析json字符串,根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容后,确定每个字段名称对应的数据内容的原始数据类型,并且根据确定的结果判断该json字符串中包含的所有数据内容中是否包含至少两个原始数据类型为数值类型的数据内容。

例如,在前述实施例中接收得到的json字符串1,解析json字符串1后,根据解析结果确定json字符串1中包含4个字段,分别为字段1:字段名称“local”,对应的数据内容“hebei”;字段2:字段名称“channel”,对应的数据内容“cctv-1”;字段3:字段名称“allpeoplecount”,对应的数据内容“123001”;字段4:字段名称“allplaytime”,对应的数据内容“20023.12”,确定每个字段名称对应的数据内容的原始数据类型:字段名称“local”对应的数据内容“hebei”的原始数据类型为字符串类型:string型、字段名称“channel”对应的数据内容“cctv-1”的原始数据类型为字符串类型:string型、字段名称“allpeoplecount”对应的数据内容“123001”的原始数据类型为数值类型:int型、字段名称“allplaytime”对应的数据内容“20023.12”的原始数据类型为数值类型:float型。在确定每个字段名称对应的数据内容的原始数据类型后,判断json字符串1中包含的所有数据内容中是否至少包含两个原始数据类型为数值类型的数据内容。

104、若是,则按照每个数据内容对应的原始数据类型分别将json字符串转换为java对象。

在本发明实施例中,当步骤103确定该json字符串中包含的所有数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,将该json字符串转换为java对象,从而避免了按照json字符串中数据精度最高的数据内容对应的数值类型,对json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,导致反序列化得到的java对象中一些数据内容的数据精度发生改变的问题。其中,反序列化操作为将json字符串转换为java对象的过程。

进一步的,在经过反序列化操作,将json字符串转换为java对象后,可以通过get()方法获取java对象中封装的数据。

需要说明的是,在实际应用过程中,json字符串中包含的某些原始数据类型为数值类型的数据内容可以用非整数形式的数值来表达,而某些原始数据类型为数值类型的数据内容并不可用非整数形式的数值来表达,例如,人数或一些物体:电脑、手机、水杯等等。如若对这些不可用非整数形式的数值来表达的数据内容按照数据精度更高的数值类型来进行反序列化操作,那么转换得到的java对象中对应的数据内容所指代的意义就会发生改变,例如,在json字符串中某一字段对应的数据内容为“100”,是代表人数为100,对应的原始数据类型为“int型”,若按照“float型”对该数据进行反序列化操作,得到的结果可能为“100.00”,对于“人数”来说并不存在小数形式,所以反序列化得到的结果与实际情况存在误差,因此在将json字符串反序列化为java对象过程中,当json字符串中包含多个原始数据类型为数值类型的数据内容时,需要按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,从而保证反序列化得到的java对象中的数值类型的数据内容的数据精度与json字符串中对应的数据内容的数据精度一致。

例如,经过判断确定前述实施例中的json字符串1中字段3与字段4包含的数据内容的原始数据类型为数值类型,现按照json字符串1中包含的每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作:将数据内容“hebei”按照对应的原始数据类型“string型”进行反序列化操作、数据内容“cctv-1”按照对应的原始数据类型“string型”进行反序列化操作、数据内容“123001”按照对应的原始数据类型“int型”进行反序列化操作、数据内容“20023.12”按照对应的原始数据类型“float型”进行反序列化操作,将json字符串1转换为java对象1,java对象1具体为:

classvod{

privatestringlocal;

privatestringchannel;

privateintallpeoplecount;

privatefloatallplaytime;}

通过get()方法获取java对象1中封装的数据,得到结果为local=hebei,channel=cctv-1,allpeoplecount=123001,allplaytime=20023.12。

本发明实施例提供的一种反序列化方法,本发明实施例能够在解析接收到的json字符串之后,根据解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容,并确定每个字段名称对应的数据内容的原始数据类型,当经过判断该json字符串中包含的所有数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,将该json字符串转换为java对象,与现有技术中按照json字符串中数据精度最高的数据内容对应的数值类型,对json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,将json字符串转换为java对象相比,本发明实施例可以保证经过反序列化操作得到的java对象中的数值类型的数据内容的数据精度与json字符串中对应的数据内容的数据精度一致,从而提高了反序列化得到的java对象的准确率。

以下为了更加详细地说明,本发明实施例提供了另一种反序列化方法,特别是按照每个数据内容对应的原始数据类型分别将json字符串转换为java对象的具体方法,具体如图2所示,该方法包括:

201、在数据传输接口中布署解析代码。

其中,数据传输接口为位于应用系统中的api(applicationprogramminginterface,应用程序编程接口),应用系统通过数据传输接口接收和发送json字符串,从而实现不同应用系统之间通过json字符串进行数据传输。解析代码用于解析接收到的json字符串,从而根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容。

在本发明实施例中,需要预先在数据传输接口中布署解析代码,以便后续在接收到json字符串后,能够通过布署的解析代码解析接收到的json字符串,并根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容。

202、接收json字符串。

其中,关于步骤202、接收json字符串,可以参考图1对应部分的描述,本发明实施例此处将不再赘述。

203、解析json字符串,得到解析结果。

其中,关于步骤203、解析json字符串,得到解析结果,可以参考图1对应部分的描述,本发明实施例此处将不再赘述。

204、确定每个字段名称对应的数据内容的原始数据类型。

在本发明实施中,采用步骤201布署的解析代码确定json字符串中包含的每个字段名称对应的数据内容的原始数据类型。以下将对如何采用解析代码确定每个字段名称对应的数据内容的原始数据类型进行详细说明。

(1)采用解析代码识别每个字段名称对应的数据内容。

在前述步骤中通过预先布署的解析代码解析接收到的json字符串,并根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容之后,采用该解析代码识别每个字段名称对应的数据内容,以便根据每个数据内容的具体内容确定对应的原始数据类型。

(2)判断数据内容是否为数值型数据。

其中,数值型数据具体是指一个数值,可以为一个整数数值,也可以为一个非整数数值,数值型数据的类型包括:int型、long型、float型、double型,int型为整型数值类型、long型为长整型数值类型、float型为单精度浮点型数值类型、double型为双精度浮点型数值类型。其中,整数形式的数值型数据对应的类型为:int型和long型,相比较于int型,long型存储的数值的有效位数;非整数形式的数值型数据对应的类型为:float型和double型,相比较于float型,double型能够保留非整数数值小数点后的位数更多。

在经过上述步骤(1)采用解析代码识别json字符串中包含的所有数据内容后,分别判断每个数据内容是否为数值型数据,即分别判断每个数据内容是否为一个具体的数值。当某个数据内容为字符串或者为对象等等时,可直接确定这个数据内容对应的原始数据类型为字符串类型或者为对象类型等等;但是,当某个数据内容为数值型数据时,在确定这个数据内容对应的原始数据类型为数值类型的基础上,后续还需确定该数据内容对应的原始数据类型具体为数值类型中的哪一种。因此,需要分别判断每个数据内容是否为数值型数据。

例如,通过前述解析json字符串1,根据解析结果确定json字符串1中包含4个字段,分别为字段1:字段名称“local”,对应的数据内容“hebei”;字段2:字段名称“channel”,对应的数据内容“cctv-1”;字段3:字段名称“allpeoplecount”,对应的数据内容“123001”;字段4:字段名称“allplaytime”,对应的数据内容“20023.12”。采用解析代码识别json字符串1中每个字段名称对应的数据内容后,分别判断这4个数据内容是否为数值型数据,根据判断结果得知:数据内容“hebei”和数据内容“cctv-1”为字符串,从而确定数据内容“hebei”和数据内容“cctv-1”对应的原始数据类型为字符串类型:string型;数据内容“123001”和数据内容“20023.12”为数值型数据,从而确定数据内容“123001”和数据内容“20023.12”对应的原始数据类型为数值类型。

(3)若是,则确定数据内容对应的数据精度,并根据数据精度确定数据内容对应的原始数据类型。

根据上述步骤(2)判断,确定某个数据内容为数值型数据时,则确定该数据内容对应的数据精度,并根据该数据精度确定该数据内容对应的原始数据类型具体为数值类型中的哪一种。对于整数形式的数值型数据可以确定对应的原始数据类型为int型或long型,当该数值型数据的有效位数较多、即精度较高时,确定该数值型数据对应的原始数据类型为long型;当该数值型数据的有效位数较少、即精度较低时,确定该数值型数据对应的原始数据类型为int型。对于非整数形式的数值型数据可以确定该数值型数据对应的原始数据类型为float型或double型,当该数值型数据小数点后有效位数比较多、即精度较高时,确定该数值型数据对应的原始数据类型为double型;当该数值型数据小数点后有效位数比较少、即精度较低时,确定该数值型数据对应的原始数据类型为float型。

需要说明的是,对于整数形式的数值型数据的有效位数为多少位时确定该数值型数据为int型、多少位时确定该数值型数据为long型,以及对于非整数形式的数值型数据,小数点后有效位数为多少位时确定该数值型数据为float型、多少位时确定该数值型数据为double型,在实际应用过程中,可以根据具体需求来确定,在本发明实施例中不进行限定。

例如,在前述实施例中经过判断得知json字符串1中,数据内容“123001”和数据内容“20023.12”为数值型数据、对应的原始数据类型为数值类型,当确定数据内容“123001”的数据精度后,根据该数据精度确定数据内容“123001”对应的原始数据类型为数值类型:int型;当确定数据内容“20023.12”的数据精度后,根据该数据精度确定数据内容“20023.12”对应的原始数据类型为数值类型:float型。

205、判断数据内容中是否包含至少两个原始数据类型为数值类型的数据内容。

其中,关于步骤205、判断数据内容中是否包含至少两个原始数据类型为数值类型的数据内容,可以参考图1对应部分的描述,本发明实施例此处将不再赘述。

206、若是,则按照每个数据内容对应的原始数据类型分别将json字符串转换为java对象。

在本发明实施例中,当步骤204确定该json字符串中包含的所有数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,将该json字符串转换为java对象。以下将对如何将json字符串转换为java对象进行详细说明。

(1)逐一获取解析结果中包含的每个数据内容及每个数据内容对应的原始数据类型。

在前述实施例中,已经通过预先布署的解析代码解析接收到的json字符串,并根据得到的解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容,以及确定每个字段名称对应的数据内容的原始数据类型,在本发明实施例中,逐一获取解析结果中包含的每个数据内容及每个数据内容对应的原始数据类型,即逐一获取该json字符串中包含的每个数据内容以及每个数据内容对应的原始数据类型。

(2)按照每个数据内容对应的原始数据类型,依次对每个数据内容进行转换操作,生成java对象。

当经过步骤(1)逐一获取得到json字符串中包含的每个数据内容以及每个数据内容对应的原始数据类型,按照每个数据内容对应的原始数据类型,依次对每个数据内容进行反序列化操作,即按照该json字符串中第一个数据内容对应的原始数据类型对第一个数据内容进行反序列化操作,在此之后,按照第二个数据内容对应的原始数据类型对第二个数据内容进行反序列化操作,使用相同的方法,完成该json字符串中所有数据内容的反序列化操作,生成对应的java对象。进一步的,可以通过get()方法获取java对象中封装的数据。

对于本发明实施例,具体应用场景可以如下所示,但不限于此包括:

在前述实施例中,确定接收到的json字符串1中包含4个数据内容,分别为:数据内容“hebei”、数据内容“cctv-1”、数据内容“123001”、数据内容“20023.12”,并且确定数据内容“hebei”和数据内容“cctv-1”对应的原始数据类型为字符串类型:string型、数据内容“123001”对应的原始数据类型为数值类型:int型、数据内容“20023.12”对应的原始数据类型为数值类型:float型。现逐一获取json字符串1中包含的每个数据内容及每个数据内容对应的原始数据类型,并按照每个数据内容对应的原始数据类型,依次对每个数据内容进行转换操作,即首先,按照“string型”对数据内容“hebei”进行反序列化操作;然后,按照“string型”对数据内容“cctv-1”进行反序列化操作;其次,按照“int型”对数据内容“123001”进行反序列化操作;最后,按照“float型”对数据内容“20023.12”进行反序列化操作,在完成上述反序列化操作后,生成对应的java对象1,java对象1具体为:

classvod{

privatestringlocal;

privatestringchannel;

privateintallpeoplecount;

privatefloatallplaytime;}

通过get()方法获取java对象1中封装的数据,得到结果为local=hebei,channel=cctv-1,allpeoplecount=123001,allplaytime=20023.12。

进一步的,在实际应用过程中,同一个数据传输接口中接收到的多个json字符串的结构是一致的,即多个json字符串中包含的字段个数以及每个字段的字段名称是一致的,例如,应用系统a的数据传输接口接收到json字符串a和json字符串b,其中json字符串a包含3个字段,对应的json字符串b也包含3个字段;json字符串a中字段1的字段名称与json字符串b中字段1的字段名称一致、json字符串a中字段2的字段名称与json字符串b中字段2的字段名称一致以及json字符串a中字段3的字段名称与json字符串b中字段3的字段名称也一致。

因此,为了提高同一数据传输接口将多个结构相同的json字符串反序列化为java对象的转换效率,在本发明实施例的另一种实现方式中,还可以在将数据传输接口接收到的第一json字符串反序列化为对应的java对象后,将该第一json字符串中包含的每个字段的字段名称与每个字段名称对应的数据内容的原始数据类型之间的映射关系进行缓存,当该数据传输接口接收到第二json字符串时,经过解析工具代码解析该第二json字符串确定该第二json字符串与第一json字符串结构相同,此时从缓存中获取第一json字符串中每个字段名称对应的数据内容的原始数据类型,作为第二json字符串中每个字段名称对应的数据内容的原始数据类型,以便后续按照每个数据内容对应的原始数据类型,依次对第二json字符串中包含的每个数据内容进行转换操作,将第二json字符串转换为对应的java对象。因此,同一数据传输接口在接收到多个结构相同的json字符串时,当完成第一个json字符串的反序列化操作后,无需再次确定其他多个json字符串中包含的每个字段名称对应的数据内容的原始数据类型,从而提高了将json字符串反序列化为java对象的转换效率。

例如,应用系统a与应用系统b之间进行信息交互,应用系统b的数据传输接口a分别接收到了前述实施例中所述的json字符串1,在完成将json字符串1反序列化为java对象1之后,将json字符串1中的4个字段的字段名称与每个字段名称对应的数据内容的原始数据类型之间的映射关系进行缓存:分别将字段名称“local”与对应的数据内容的原始数据类型“string型”之间的映射关系、字段名称“channel”与对应的数据内容的原始数据类型“string型”之间的映射关系、字段名称“allpeoplecount”与对应的数据内容的原始数据类型“int型”之间的映射关系以及字段名称“allplaytime”与对应的数据内容的原始数据类型“float型”之间的映射关系进行缓存。在数据传输接口a接收到与json字符串1结构相同的json字符串2后,在缓存中获取json字符串1中每个字段名称对应的原始数据类型,作为json字符串2中每个字段名称对应的数据内容的原始数据类型,以便后续按照每个数据内容对应的原始数据类型,依次对json字符串2中包含的每个数据内容进行转换操作,将json字符串2转换为java对象2。

为了实现上述目的,根据本发明的另一方面,本发明实施例还提供了一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述所述的反序列化方法。

为了实现上述目的,根据本发明的另一方面,本发明实施例还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述所述的反序列化方法。

进一步的,作为对上述图1及图2所示方法的实现,本发明另一实施例还提供了一种反序列化装置。该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。该装置应用于提高反序列化得到的java对象的准确率,具体如图3所示,该装置包括:

接收单元31,用于接收json字符串;

解析单元32,用于解析接收单元31接收的所述json字符串,得到解析结果,其中,所述解析结果中包含多个字段,每个所述字段包括:字段名称及对应的数据内容;

确定单元33,用于确定解析单元32解析得到的每个字段名称对应的数据内容的原始数据类型;

判断单元34,用于判断所述数据内容中是否包含至少两个原始数据类型为数值类型的数据内容;

转换单元35,用于当判断单元34判断所述数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象。

进一步的,如图4所示,确定单元33包括:

识别模块331,用于采用解析代码识别所述每个字段名称对应的数据内容;

判断模块332,用于判断所述识别模块331识别的所述数据内容是否为数值型数据;

确定模块333,用于当所述判断模块332判断所述数据内容为数值型数据时,确定所述数据内容对应的数据精度,并根据所述数据精度确定所述数据内容对应的原始数据类型。

进一步的,如图4所示,转换单元35包括:

获取模块351,用于逐一获取所述解析结果中包含的每个数据内容及所述每个数据内容对应的原始数据类型;

生成模块352,用于按照获取模块351获取的所述每个数据内容对应的原始数据类型,依次对所述每个数据内容进行转换操作,生成所述java对象。

进一步的,如图4所示,所述数值型数据的类型包括:int型、long型、float型、double型。

进一步的,如图4所示,该装置还包括:

布署单元36,用于在数据传输接口中布署解析代码,其中,所述数据传输接口用于接收所述json字符串,所述解析代码用于解析所述json字符串,以获得所述json字符串中每个字段包括的字段名称及对应的数据内容。

进一步的,如图4所示,该装置还包括:

缓存单元37,用于将所述每个字段名称与对应的原始数据类型的映射关系进行缓存;

获取单元38,用于当所述数据传输接口接收到与所述json字符串结构相同的json字符串时,从缓存中获取缓存单元37缓存的所述结构相同的json字符串包含的每个字段名称对应的数据内容的原始数据类型,以便按照每个数据内容对应的原始数据类型分别将所述结构相同的json字符串转换为java对象。

本发明实施例提供的一种反序列化装置,本发明实施例能够在解析接收到的json字符串之后,根据解析结果确定该json字符串中包含的每一个字段的字段名称以及对应的数据内容,并确定每个字段名称对应的数据内容的原始数据类型,当经过判断该json字符串中包含的所有数据内容中包含至少两个原始数据类型为数值类型的数据内容时,按照每个数据内容对应的原始数据类型分别对每个数据内容进行反序列化操作,将该json字符串转换为java对象,与现有技术中按照json字符串中数据精度最高的数据内容对应的数值类型,对json字符串中所有原始数据类型为数值类型的数据内容进行反序列化操作,将json字符串转换为java对象相比,本发明实施例可以保证经过反序列化操作得到的java对象中的数值类型的数据内容的数据精度与json字符串中对应的数据内容的数据精度一致,从而提高了反序列化得到的java对象的准确率。同时,本发明实施例能够在将json字符串转换为java对象后,将该json字符串中的每个字段名称与每个字段名称对应的数据内容的原始数据类型之间的映射关系进行缓存,在后续接收到结构相同的json字符串时,无需再次确定结构相同的json字符串中的每个字段名称对应的数据内容的原始数据类型,从而提高了将json字符串反序列化为java对象的转换效率

所述反序列化装置包括处理器和存储器,上述接收单元、解析单元、确定单元、判断单元和转换单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来提高反序列化得到的java对象的准确率。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram),存储器包括至少一个存储芯片。

本发明实施例提供了一种存储介质,其上存储有程序,该程序被处理器执行时实现以上实施例中任一项所述的反序列化方法。

本发明实施例提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行以上实施例中任一项所述的反序列化方法。

本发明实施例提供了一种设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现以下步骤:

接收json字符串;

解析所述json字符串,得到解析结果,其中,所述解析结果中包含多个字段,每个所述字段包括:字段名称及对应的数据内容;

确定每个字段名称对应的数据内容的原始数据类型,并判断所述数据内容中是否包含至少两个原始数据类型为数值类型的数据内容;

若是,则按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象。

进一步的,确定每个字段名称对应的数据内容的原始数据类型包括:

采用解析代码识别所述每个字段名称对应的数据内容;

判断所述数据内容是否为数值型数据;

若是,则确定所述数据内容对应的数据精度,并根据所述数据精度确定所述数据内容对应的原始数据类型。

进一步的,按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象包括:

逐一获取所述解析结果中包含的每个数据内容及所述每个数据内容对应的原始数据类型;

按照所述每个数据内容对应的原始数据类型,依次对所述每个数据内容进行转换操作,生成所述java对象。

进一步的,所述数值型数据的类型包括:int型、long型、float型、double型。

进一步的,在接收json字符串之前,所述方法还包括:

在数据传输接口中布署解析代码,其中,所述数据传输接口用于接收所述json字符串,所述解析代码用于解析所述json字符串,以获得所述json字符串中每个字段包括的字段名称及对应的数据内容。

进一步的,所述方法还包括:

将所述每个字段名称与对应的原始数据类型的映射关系进行缓存;

当所述数据传输接口接收到与所述json字符串结构相同的json字符串时,从缓存中获取所述结构相同的json字符串包含的每个字段名称对应的数据内容的原始数据类型,以便按照每个数据内容对应的原始数据类型分别将所述结构相同的json字符串转换为java对象。

本文中的设备可以是服务器、pc、pad、手机等。

本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序代码:接收json字符串;解析所述json字符串,得到解析结果,其中,所述解析结果中包含多个字段,每个所述字段包括:字段名称及对应的数据内容;确定每个字段名称对应的数据内容的原始数据类型,并判断所述数据内容中是否包含至少两个原始数据类型为数值类型的数据内容;若是,则按照每个数据内容对应的原始数据类型分别将所述json字符串转换为java对象。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。存储器是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1