CN109871519A - 一种无层级结构的json反序列化方法、装置及存储介质 - Google Patents
一种无层级结构的json反序列化方法、装置及存储介质 Download PDFInfo
- Publication number
- CN109871519A CN109871519A CN201910123348.2A CN201910123348A CN109871519A CN 109871519 A CN109871519 A CN 109871519A CN 201910123348 A CN201910123348 A CN 201910123348A CN 109871519 A CN109871519 A CN 109871519A
- Authority
- CN
- China
- Prior art keywords
- attribute
- json
- target
- character string
- comments
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种无层级结构的JSON反序列化方法、装置及存储介质,所述方法主要包括:通过解析目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;基于所述注解属性给所述目标属性进行赋值。综上所述,通过注解属性,可消除目标JSON字符串反序列化成Java对象的层级结构,实现了无层级结构的JSON字符串反序列化操作,提高了业务侧代码的复用率,使***开发效率更高,代码编写更简单。
Description
技术领域
本发明涉及互联网技术领域,尤其涉及一种无层级结构的JSON反序列化方法、装置及存储介质。
背景技术
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(StandardECMA-2623rdEdition-December 1999)脚本语言的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。易于用户阅读和编写,同时也易于机器解析和生成。
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。上述中的对象(Object)就是客观世界中存在的人、事、物体等实体在计算机逻辑中的映射。反序列化(Deserialization)是与序列化相对的,它将Json字符串形式的数据流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
现有技术中,大部分编程语言都有对应的JSON解析器,在Java语言中,开源的JSON解析器包括:fastjson、jackjson和gson等,这些解析器都支持把JSON字符串反序列化成用户自定义的JavaBean对象,但都要求用户自定义的Java Bean对象保持和JSON一样的层级,一方面导致在实际的***开发中,如需使用JSON作为请求入参,经常存在JSON格式层级结构多,JSON嵌套很深,每一层结构都需要编写一个自定义JavaBean对象,代码比较复杂;另一方面,在实际的***开发中还存在这样的场景,不同的业务逻辑代码,当JSON作为请求入参格式,可能只是调整了某一个参数的层级位置,业务代码获取对象的属性时却需要用到类似getUser(),getName()等方式,业务代码与JSON的层级之间未解耦,业务代码得不到复用。综上所述,现有技术中的JSON字符串反序列化技术存在业务侧代码复用率低,导致***开发效率低,代码编写复杂的技术问题。
发明内容
本发明实施例提供一种无层级结构的JSON反序列化方法、装置及存储介质,主要旨在解决现有技术中由于JSON字符串反序列化成用户自定义的JavaBean对象,需保持和JSON字符串一样的层级,使业务侧代码复用率低,导致***开发效率低,代码编写复杂的技术问题。
第一方面,本发明实施例提供了一种无层级结构的JSON反序列化方法,具体包括:
获取目标JSON字符串;
通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;
根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;
为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;
基于所述注解属性给所述目标属性进行赋值。
有益效果:本发明实施例主要包括获取目标JSON字符串;通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;为所述目标字段添加注解属性,所述目标字段的目标属性为所述注解属性分解后的属性;基于所述注解属性给所述目标属性进行赋值。综上所述,通过为Java对象中的目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性,如此,完成目标JSON字符串反序列化操作,Java对象并不需要与原目标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属性和JSON属性值,遍历所有对象节点和数组节点,以及判断对象节点和数组节点是否存在子节点,如果存在子节点,还需要依次遍历,并获取所述子节点的所有JSON属性和JSON属性值,使JSON字符串的解析数据更完整,不会出现遗漏的情况。
优选地,所述为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性,具体包括:
为所述目标字段添加注解属性,所述注解属性包括对象格式字符串对应的对象节点属性、对象子节点属性以及所述对象格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性;
和/或,
为所述目标字段添加注解属性,所述注解属性包括数组格式字符串对应的数组节点属性、数组子节点属性以及所述数组格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性。
有益效果:通过为用户自定义Java对象中的目标字段添加注解属性,并将所述注解属性分解后的JSON属性作为所述目标字段的目标属性,消除将目标JSON字符串反序列化成Java对象后的层级结构,利用注解属性进行代替,实现了无层级结构的JSON字符串反序列化,提高了业务侧代码的复用率,使***开发效率更高,代码编写更简单。
优选地,所述基于所述注解属性给所述目标属性进行赋值,具体包括:
判断所述注解属性中第一个属性的属性值类型是否为虚拟类型,所述虚拟类型对应的注解属性为可分解的属性;
如果所述注解属性中第一个属性的属性值类型为虚拟类型时,则遍历所述注解属性中所有的属性,直到最后一个属性,获取所述最后一个属性的属性值类型;
所述最后一个属性的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性。
有益效果:判断注解属性中第一个属性的属性值类型是否为虚拟类型,如果是,不用赋值,继续依次判断下一个属性的属性值类型是否为虚拟类型,直到最后一个属性,获取最后一个属性的属性值类型,若为基本数据类型,则将所述JSON属性值赋给所述目标属性,完成所述目标JSON字符串反序列化操作,有利于提高Java对象中字段的赋值效率,即提高JSON字符串反序列化的效率,同时,在上述实施例的基础上,实现了无层级结构的JSON字符串反序列化操作。
优选地,所述获取所述最后一个属性的属性值类型,之后还包括:
所述最后一个属性的属性值类型为集合类型时,遍历所述集合类型对应的目标集合,依次获取所述目标集合的元素对应的属性值类型,所述目标集合包括所述最后一个属性的属性值类型;
所述目标集合的元素对应的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性,并将所述JSON属性值加入所述目标集合;
或者,
所述目标集合的元素对应的属性值类型为自定义类型时,则将所述JSON属性值转换为所述自定义类型,以及将所述转换后的JSON属性值赋给所述目标属性,并将所述转换后的JSON属性值加入所述目标集合。
有益效果:当最后一个属性的属性值类型为集合类型时,根据集合中包含的数据类型依次赋值,并将返回的值加入到集合中,完成对所述最后一个属性的赋值,完成所述目标JSON字符串反序列化操作,有利于提高Java对象中字段的赋值效率,即提高JSON字符串反序列化的效率,同时,在上述实施例的基础上,实现了无层级结构的JSON字符串反序列化操作。
第二方面,本发明提供了一种无层级结构的JSON反序列化装置,所述装置包括:
获取模块,用于获取目标JSON字符串;
解析模块,用于通过解析所述目标JSON字符串,并获取所述目标JSON字符串包含的JSON属性和JSON属性值;
确定模块,用于根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标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反序列化设备,所述设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述方法实施例中记载的任何一种无层级结构的JSON反序列化方法的部分或全部步骤。
第四方面,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法实施例中记载的任何一种无层级结构的JSON反序列化方法的部分或全部步骤。
本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种无层级结构的JSON反序列化方法的流程示意图;
图2为本发明实施例提供的一种无层级结构的JSON反序列化装置的结构示意图;
图3为本发明实施例提供的一种无层级结构的JSON反序列化设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
下面将结合附图对本申请的实施例进行描述,但并非对本发明的限制。
实施例一
根据本发明的一个方面,提供了一种无层级结构的JSON反序列化方法,具体包括以下步骤,如图1所示:
S1,获取目标JSON字符串;
需要说明的是,该目标JSON字符串中包含有进行反序列化生成的对象的属性,例如,当对象为房子时,其具有的属性包括房子地理位置、房子价格、房子面积和备注等,将该房子的对象进行序列化之后,又可以生成有与该房子对应的JSON字符串,该JSON字符串具有与房子的属性相对应的属性值。获取目标JSON字符串是为了后续步骤将该目标JSON字符串进行反序列化。
JSON是一种轻量级的数据交换格式,包括了两种结构的数据格式,即对象和数组两种结构,通过这两种结构可以表示各种复杂的数据结构。
对象表示为“{}”括起来的内容,数据结构为{key:value,key:value,...},在面向对象的语言中,例如在Java语言中,其中key为对象的属性,value为其属性对应的属性值,取值方法为对象,key获取属性值,属性值的类型可以包括数字、字符串、数组和对象等。
数组表示为“[]”括起来的内容,数据结构为["java","javascript",...],取值方式可以使用索引获取,其中数组中的字段值的类型可以包括数字、字符串、数组和对象等。
S2,通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;
需要说明的是,解析所述目标JSON字符串,可以提供基本的方法,采用逐字符的方式解析、识别出所述目标JSON字符串中的对象和数组。针对对象结构的JSON字符串解析出属性和属性值。针对数组结构的JSON字符串解析出列表值,列表值包括JSON属性和JSON属性值。首先提供一个对所述目标JSON字符串解析API,用此API解析所述目标JSON字符串时,要求该API的调用和所述目标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对象格式字符串的结束符“}”。
针对所述目标JSON数组格式字符串的解析,以“[”开始的字符串开始解析,“[”即为所述目标JSON数组格式字符串的开始符。然后开始读取所述目标JSON数组格式字符串的第一个数组节点,读取所述第一个数组节点下的第一个属性。读取所述第一个属性对应的属性值。返回重复执行上述步骤,依次读取所述目标JSON数组格式字符串的其它数组节点,以及所述数组节点下的属性和属性值。在读取每一个数组节点时,需要判断该数组节点是否存在子节点,如果该数组节点存在子节点,还需要依次读取该子节点下的JSON属性和JSON属性值。直到所述目标JSON数组格式字符串的所有属性和属性值均已读取完,即读取到所述目标JSON数组格式字符串的结束符“]”
S3,根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;
根据上述步骤,解析所述目标JSON字符串,可以获取到所述目标JSON字符串中包含的JSON属性和对应的JSON属性值,JSON属性包括JSON属性的名称,将Java对象中与所述JSON属性的名称相同的字段确定为目标字段。
S4,为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;
需要说明的是,现有技术中将JSON字符串进行反序列化为Java对象,Java对象的结构需要保持与原JSON字符串相同的层级结构,JSON字符串的层级结构越多,Java对象编写的类就越多,代码越繁琐,而且程序代码的复用率低。因此,这里采用一种注解的方式将所有属性抽取到一个类。类(Class)是面向对象程序设计语言中的一个概念,实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面对对象编程的基础。一个类定义了一组对象。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。类通过接口与外界***。
注解属性的名称不再是Java对象中目标字段的属性名称,而应该是将注解表达属性进行分解之后的属性名称,其作为Java对象的一个虚拟属性,虚拟属性定义为虚拟类型。
下面举例说明
例如一个JSON字符串如下所示:
为了将上述JSON字符反序列化成一个Java对象,现有技术中,至少需要定义四个类。类分别如下(其中未列出基本类型属性):
因此,采用一种注解的方式将所有属性抽取到一个类,为Java对象中的字段添加注解属性,并将所述注解属性分解后得到的属性作为所述Java对象中的字段的目标属性,上述定义的四个类简化后,抽取到一个类如下:
其中,注解@ParamDesc(path="info.user.age")中的注解属性表达为"info.user.age",分解后的属性为age,作为Java对象中的目标字段的目标属性age。
进一步的,为所述目标字段添加注解属性,所述注解属性包括对象格式字符串对应的对象节点属性、对象子节点属性以及所述对象格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性;
和/或,
为所述目标字段添加注解属性,所述注解属性包括数组格式字符串对应的数组节点属性、数组子节点属性以及所述数组格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性。
需要说明的是,例如注解@ParamDesc(path="info.user.age")中的注解属性表达为"info.user.age",包括对象节点属性info,对象子节点属性user,以及所述对象格式字符串对应的JSON属性age。
S5,基于所述注解属性给所述目标属性进行赋值。
需要说明的是,通过为Java对象中的字段添加注解属性,采用一种注解的方式,简化定义的类,并且,将所述注解属性分解后的属性作为Java对象中所述目标字段的目标属性,根据所述注解属性分解后的JSON属性,可获取JSON属性对应的JSON属性值,将所述JSON属性值赋给所述Java对象中所述目标字段的目标属性,即完成所述目标JSON字符串反序列化操作。
进一步的,所述基于所述注解属性给所述目标属性进行赋值,具体包括以下步骤:
判断所述注解属性中第一个属性的属性值类型是否为虚拟类型,所述虚拟类型对应的注解属性为可分解的属性;
需要说明的是,注解属性的名称不再是Java对象中目标字段的属性名称,而应该是将注解表达属性进行分解之后的属性名称,其作为Java对象的一个虚拟属性,虚拟属性定义为虚拟类型。例如,注解@ParamDesc(path="info.user.age")中的注解属性表达为"info.user.age",首先判断属性info是否为虚拟属性,当属性info后面有符号“.”,则可以确定属性info为虚拟属性,其属性值类型即为虚拟类型,所述虚拟类型对应的注解属性为可分解的属性,可以继续分解所述注解属性,得到属性"user.age",再判断属性user的属性值类型是否为虚拟类型,属性user后面有符号“.”,确定属性user为虚拟属性,可继续分解,得到属性"age",同上,判断属性age的属性值类型不是虚拟类型,不可再分解,于是,将属性age作为所述目标字段的目标属性。
如果所述注解属性中第一个属性的属性值类型为虚拟类型时,则遍历所述注解属性中所有的属性,直到最后一个属性,获取所述最后一个属性的属性值类型;
需要说明的是,当判断所述注解属性的属性值类型为虚拟类型时,则继续依次判断下一属性的属性值类型,根据上述的例子可知,即判断属性user是否为虚拟属性,属性user后面有符号“.”,则可以确定属性user为虚拟属性,其属性值类型为虚拟类型,然后,继续依次判断下一属性的属性值类型,直到最后一个属性,即判断属性age是否为虚拟属性,属性age后面没有符号“.”,则可以确定属性age不是虚拟属性,获取属性age的属性值类型。
所述最后一个属性的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性。
需要说明的是,基本数据类型包括String、Int和long,若所述最后一个属性的属性值类型为基本数据类型时,即属性age的属性值类型若为基本数据类型时,则将属性age的属性值赋给所述目标属性age,重复上述步骤,将所有Java对象中的字段都添加注解属性,以及对所述字段进行赋值,即可完成所述目标JSON字符串反序列化操作。本发明方案中,Java对象可以是用户自定义的,所以只需要根据用户自定义的Java对象中的字段进行JSON字符串反序列化即可,可以利用检索的方法读取JSON字符串中的JSON属性和JSON属性值。
所述最后一个属性的属性值类型为集合类型时,遍历所述集合类型对应的目标集合,依次获取所述目标集合的元素对应的属性值类型,所述目标集合包括所述最后一个属性的属性值类型;
需要说明的是,当所述最后一个属性的属性值类型为集合类型时,例如,所述最后一个属性为房子,其属性值包括房子1的面积、房子2的楼层、房子3的价格、房子4的地理位置,其中属性值类型对应包括Double、int、Currency、string,将包括所述最后一个属性的属性值类型的集合作为目标集合,记为T,那么集合T为T{T1,T2,T3,T4},其中,T1,T2,T3,T4分别为Double、int、Currency、string。遍历集合T{T1,T2,T3,T4},依次获取集合T中的元素T1,T2,T3,T4对应的属性值类型。
所述目标集合的元素对应的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性,并将所述JSON属性值加入所述目标集合;
或者,
所述目标集合的元素对应的属性值类型为自定义类型时,则将所述JSON属性值转换为所述自定义类型,以及将所述转换后的JSON属性值赋给所述目标属性,并将所述转换后的JSON属性值加入所述目标集合。
需要说明的是,依次获取集合T中的元素T1,T2,T3,T4对应的属性值类型之后,例如,T1对应的属性值类型为基本数据类型时,将所述JSON属性值赋给所述目标属性,并将所述JSON属性值加入所述目标集合T中,若T1对应的属性值类型为自定义类型时,则将所述JSON属性值转换为所述自定义类型,以及将所述转换后的JSON属性值赋给所述目标属性,并将所述转换后的JSON属性值加入所述目标集合T中。按照集合T中的数据类型,依次给所述最后一个属性进行赋值,将返回的值加入所述目标集合T中,完成所述目标属性的赋值。
有益效果:本发明实施例主要包括获取目标JSON字符串;通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;为所述目标字段添加注解属性,所述目标字段的目标属性为所述注解属性分解后的属性;基于所述注解属性给所述目标属性进行赋值。综上所述,通过为Java对象中的目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性,如此,完成目标JSON字符串反序列化操作,Java对象并不需要与原目标JSON字符串保持一样的层级,而是将目标JSON字符串原有的层级结构消除,利用注解属性进行代替,实现了无层级结构的JSON字符串反序列化,提高了业务侧代码的复用率,使***开发效率更高,代码编写更简单。
实施例二
本发明实施例提供了一种无层级结构的JSON反序列化装置,如图2所示,图2为一种无层级结构的JSON反序列化装置200的结构示意图,所述装置具体包括:
获取模块210,用于获取目标JSON字符串;
解析模块220,用于通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;
确定模块230,用于根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;
添加模块240,用于为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;
赋值模块250,所述赋值模块基于所述注解属性给所述目标属性进行赋值。
进一步的,所述解析模块220,具体包括:
第一读取单元,用于从所述目标JSON对象格式字符串的开始符开始,依次读取所述目标JSON对象格式字符串的对象节点对应的JSON属性和属性值,还用于所述目标JSON对象格式字符串的对象节点存在子节点时,依次读取所述对象节点的子节点对应的JSON属性和属性值;
第一判断单元,用于判断所述目标JSON对象格式字符串的对象节点是否存在子节点;
和/或,
第二读取单元,用于从所述目标JSON数组格式字符串的开始符开始,依次读取所述目标JSON数组格式字符串的数组节点对应的JSON属性和属性值,还用于所述目标JSON数组格式字符串的数组节点存在子节点时,依次读取所述数组节点的子节点对应的JSON属性和属性值;
第二判断单元,用于判断所述目标JSON数组格式字符串的数组节点是否存在子节点。
进一步的,所述添加模块240,具体包括:
添加单元,用于为所述目标字段添加注解属性;
第一分解单元,用于将所述注解属性分解,并将所述注解属性分解后得到的属性作为所述目标字段的目标属性,所述注解属性包括对象格式字符串对应的对象节点属性、对象子节点属性以及所述对象格式字符串对应的JSON属性;和/或,
第二分解单元,用于将所述注解属性分解,并将所述注解属性分解后得到的属性作为所述目标字段的目标属性,所述注解属性包括包括数组格式字符串对应的数组节点属性、数组子节点属性以及所述数组格式字符串对应的JSON属性。
进一步的,所述赋值模块,具体包括:
第三判断单元,用于判断所述注解属性中第一个属性的属性值类型是否为虚拟类型,所述注解属性包括虚拟属性,所述虚拟属性的属性值类型为虚拟类型;
第一获取单元,用于所述注解属性中第一个属性的属性值类型为虚拟类型时,则遍历所述注解属性的节点,直到最后一个属性,获取所述最后一个属性的属性值类型;
第一赋值单元,用于所述最后一个属性的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性,完成所述目标JSON字符串反序列化操作。
进一步的,所述赋值模块,还包括:
第二获取单元,用于所述最后一个属性的属性值类型为集合类型时,遍历所述集合类型对应的目标集合,依次获取所述目标集合的元素对应的属性值类型,所述目标集合包括所述最后一个属性的属性值类型;
第二赋值单元,用于所述目标集合元素对应的的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性,并将所述JSON属性值加入所述目标集合,完成所述目标JSON字符串反序列化操作;
或者,
转换单元,用于所述目标集合元素对应的的属性值类型为自定义类型时,则将所述JSON属性值转换为所述自定义类型;
第三赋值单元,用于将所述转换单元转换后的JSON属性值赋给所述目标属性,并将所述转换后的JSON属性值加入所述目标集合,完成所述目标JSON字符串反序列化操作。
本发明实施例一种无层级结构的JSON反序列化装置200是对应上述实施例一种无层级结构的JSON反序列化方法,在所述反序列化装置200中还包括若干单元,用于对应上述一种无层级结构的JSON反序列化方法的相应步骤,实现相应的功能。由于上述实施例中已经对一种无层级结构的JSON反序列化方法的步骤进行了详细的说明,故在此装置200中不再赘述。
有益效果:本发明实施例主要包括获取目标JSON字符串;通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;为所述目标字段添加注解属性,所述目标字段的目标属性为所述注解属性分解后的属性;基于所述注解属性给所述目标属性进行赋值。综上所述,通过为Java对象中的目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性,如此,在完成目标JSON字符串反序列化操作,Java对象并不需要与原目标JSON字符串保持一样的层级,而是将目标JSON字符串原有的层级结构消除,利用注解属性进行代替,实现了无层级结构的JSON字符串反序列化,提高了业务侧代码的复用率,使***开发效率更高,代码编写更简单。
实施例三
如图3所示,本发明的具体实施例还提供了一种无层级结构的JSON反序列化设备3,该反序列化设备3包括存储器31、处理器32以及存储在存储器31中并可在处理器32上运行的计算机程序33,该处理器32执行计算机程序33时实现上述的一种无层级结构的JSON反序列化方法的步骤。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法实施例中记载的任何一种无层级结构的JSON反序列化方法的部分或全部步骤。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上对本发明实施例进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种无层级结构的JSON反序列化方法,其特征在于,所述方法包括:
获取目标JSON字符串;
通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;
根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;
为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;
基于所述注解属性给所述目标属性进行赋值。
2.根据权利要求1所述的JSON反序列化方法,其特征在于,所述通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值,具体包括:
所述目标JSON字符串包括目标JSON对象格式字符串和/或目标JSON数组格式字符串;
从所述目标JSON对象格式字符串的开始符开始,依次读取所述目标JSON对象格式字符串的对象节点对应的JSON属性和JSON属性值;
判断所述目标JSON对象格式字符串的对象节点是否存在子节点;
若存在,则依次读取所述对象节点的子节点对应的JSON属性和JSON属性值;
和/或,
从所述目标JSON数组格式字符串的开始符开始,依次读取所述目标JSON数组格式字符串的数组节点对应的JSON属性和JSON属性值;
判断所述目标JSON数组格式字符串的数组节点是否存在子节点;
若存在,则依次读取所述数组节点的子节点对应的JSON属性和JSON属性值。
3.根据权利要求2所述的JSON反序列化方法,其特征在于,所述为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性,具体包括:
为所述目标字段添加注解属性,所述注解属性包括对象格式字符串对应的对象节点属性、对象子节点属性以及所述对象格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性;
和/或,
为所述目标字段添加注解属性,所述注解属性包括数组格式字符串对应的数组节点属性、数组子节点属性以及所述数组格式字符串对应的JSON属性,将所述注解属性分解后得到的属性作为所述目标字段的目标属性。
4.根据权利要求3所述的JSON反序列化方法,其特征在于,所述基于所述注解属性给所述目标属性进行赋值,具体包括:
判断所述注解属性中第一个属性的属性值类型是否为虚拟类型,所述虚拟类型对应的注解属性为可分解的属性;
如果所述注解属性中第一个属性的属性值类型为虚拟类型时,则遍历所述注解属性中所有的属性,直到最后一个属性,获取所述最后一个属性的属性值类型;
所述最后一个属性的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性。
5.根据权利要求4所述的JSON反序列化方法,其特征在于,所述获取所述最后一个属性的属性值类型,之后还包括:
所述最后一个属性的属性值类型为集合类型时,遍历所述集合类型对应的目标集合,依次获取所述目标集合的元素对应的属性值类型,所述目标集合包括所述最后一个属性的属性值类型;
所述目标集合的元素对应的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性,并将所述JSON属性值加入所述目标集合;
或者,
所述目标集合的元素对应的属性值类型为自定义类型时,则将所述JSON属性值转换为所述自定义类型,以及将所述转换后的JSON属性值赋给所述目标属性,并将所述转换后的JSON属性值加入所述目标集合。
6.一种无层级结构的JSON反序列化装置,其特征在于,所述装置具体包括:
获取模块,用于获取目标JSON字符串;
解析模块,用于通过解析所述目标JSON字符串,获取所述目标JSON字符串包含的JSON属性和JSON属性值;
确定模块,用于根据所述目标JSON字符串包含的JSON属性确定Java对象中的目标字段,所述目标字段的字段名称与所述目标JSON字符串包含的JSON属性的属性名称相同;
添加模块,用于为所述目标字段添加注解属性,并将所述注解属性分解后的属性作为所述目标字段的目标属性;
赋值模块,所述赋值模块基于所述注解属性给所述目标属性进行赋值。
7.根据权利要求6所述的JSON反序列化装置,其特征在于,所述目标JSON字符串包括目标JSON对象格式字符串和/或目标JSON数组格式字符串,所述解析模块,具体包括:
第一读取单元,用于从所述目标JSON对象格式字符串的开始符开始,依次读取所述目标JSON对象格式字符串的对象节点对应的JSON属性和属性值,还用于所述目标JSON对象格式字符串的对象节点存在子节点时,依次读取所述对象节点的子节点对应的JSON属性和属性值;
第一判断单元,用于判断所述目标JSON对象格式字符串的对象节点是否存在子节点;
和/或,
第二读取单元,用于从所述目标JSON数组格式字符串的开始符开始,依次读取所述目标JSON数组格式字符串的数组节点对应的JSON属性和属性值,还用于所述目标JSON数组格式字符串的数组节点存在子节点时,依次读取所述数组节点的子节点对应的JSON属性和属性值;
第二判断单元,用于判断所述目标JSON数组格式字符串的数组节点是否存在子节点。
8.根据权利要求7所述的JSON反序列化装置,其特征在于,所述添加模块具体包括:
添加单元,用于为所述目标字段添加注解属性;
第一分解单元,用于将所述注解属性分解,并将所述注解属性分解后得到的属性作为所述目标字段的目标属性,所述注解属性包括对象格式字符串对应的对象节点属性、对象子节点属性以及所述对象格式字符串对应的JSON属性;和/或,
第二分解单元,用于将所述注解属性分解,并将所述注解属性分解后得到的属性作为所述目标字段的目标属性,所述注解属性包括包括数组格式字符串对应的数组节点属性、数组子节点属性以及所述数组格式字符串对应的JSON属性。
9.根据权利要求7所述的JSON反序列化装置,其特征在于,所述赋值模块具体包括:
第三判断单元,用于判断所述注解属性中第一个属性的属性值类型是否为虚拟类型,所述注解属性包括虚拟属性,所述虚拟属性的属性值类型为虚拟类型;
第一获取单元,用于所述注解属性中第一个属性的属性值类型为虚拟类型时,则遍历所述注解属性的节点,直到最后一个属性,获取所述最后一个属性的属性值类型;
第一赋值单元,用于所述最后一个属性的属性值类型为基本数据类型时,则将所述JSON属性值赋给所述目标属性。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述的一种无层级结构的JSON反序列化方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910123348.2A CN109871519A (zh) | 2019-02-18 | 2019-02-18 | 一种无层级结构的json反序列化方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910123348.2A CN109871519A (zh) | 2019-02-18 | 2019-02-18 | 一种无层级结构的json反序列化方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109871519A true CN109871519A (zh) | 2019-06-11 |
Family
ID=66918863
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910123348.2A Pending CN109871519A (zh) | 2019-02-18 | 2019-02-18 | 一种无层级结构的json反序列化方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109871519A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110727703A (zh) * | 2019-09-23 | 2020-01-24 | 苏宁云计算有限公司 | 一种自动识别json代码中注释的方法及装置 |
CN110929100A (zh) * | 2019-10-23 | 2020-03-27 | 东软集团股份有限公司 | 获取取值路径的方法、装置、存储介质和电子设备 |
CN112130860A (zh) * | 2020-09-23 | 2020-12-25 | 北京奇艺世纪科技有限公司 | Json对象解析方法、装置、电子设备及存储介质 |
CN112433787A (zh) * | 2020-11-09 | 2021-03-02 | 北京达佳互联信息技术有限公司 | 目标对象的序列化方法、装置、电子设备及存储介质 |
CN113918770A (zh) * | 2021-12-16 | 2022-01-11 | 上海冰鉴信息科技有限公司 | 字符串与时间字段的转换方法及装置 |
CN114331416A (zh) * | 2021-12-30 | 2022-04-12 | 深圳市兆珑科技有限公司 | 数据处理的方法、装置、电子设备及存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及*** |
CN102750268A (zh) * | 2012-06-19 | 2012-10-24 | 山东中创软件商用中间件股份有限公司 | 一种对象序列化方法、对象反序列化方法、装置及*** |
CN103605518A (zh) * | 2013-11-19 | 2014-02-26 | 北京国双科技有限公司 | 对象反序列化方法和装置 |
CN105573758A (zh) * | 2015-12-16 | 2016-05-11 | 福建星网智慧科技股份有限公司 | 基于动态字节码编译技术的codejson框架 |
US9424003B1 (en) * | 2014-10-24 | 2016-08-23 | Emc Corporation | Schema-less system output object parser and code generator |
CN106326377A (zh) * | 2016-08-15 | 2017-01-11 | 东软集团股份有限公司 | 序列化方法、反序列化方法、装置和*** |
CN107038022A (zh) * | 2015-07-13 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种反序列化方法及装置 |
-
2019
- 2019-02-18 CN CN201910123348.2A patent/CN109871519A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及*** |
CN102750268A (zh) * | 2012-06-19 | 2012-10-24 | 山东中创软件商用中间件股份有限公司 | 一种对象序列化方法、对象反序列化方法、装置及*** |
CN103605518A (zh) * | 2013-11-19 | 2014-02-26 | 北京国双科技有限公司 | 对象反序列化方法和装置 |
US9424003B1 (en) * | 2014-10-24 | 2016-08-23 | Emc Corporation | Schema-less system output object parser and code generator |
CN107038022A (zh) * | 2015-07-13 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种反序列化方法及装置 |
CN105573758A (zh) * | 2015-12-16 | 2016-05-11 | 福建星网智慧科技股份有限公司 | 基于动态字节码编译技术的codejson框架 |
CN106326377A (zh) * | 2016-08-15 | 2017-01-11 | 东软集团股份有限公司 | 序列化方法、反序列化方法、装置和*** |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110727703A (zh) * | 2019-09-23 | 2020-01-24 | 苏宁云计算有限公司 | 一种自动识别json代码中注释的方法及装置 |
CN110727703B (zh) * | 2019-09-23 | 2022-10-11 | 苏宁云计算有限公司 | 一种自动识别json代码中注释的方法及装置 |
CN110929100A (zh) * | 2019-10-23 | 2020-03-27 | 东软集团股份有限公司 | 获取取值路径的方法、装置、存储介质和电子设备 |
CN112130860A (zh) * | 2020-09-23 | 2020-12-25 | 北京奇艺世纪科技有限公司 | Json对象解析方法、装置、电子设备及存储介质 |
CN112130860B (zh) * | 2020-09-23 | 2023-09-05 | 北京奇艺世纪科技有限公司 | Json对象解析方法、装置、电子设备及存储介质 |
CN112433787A (zh) * | 2020-11-09 | 2021-03-02 | 北京达佳互联信息技术有限公司 | 目标对象的序列化方法、装置、电子设备及存储介质 |
CN113918770A (zh) * | 2021-12-16 | 2022-01-11 | 上海冰鉴信息科技有限公司 | 字符串与时间字段的转换方法及装置 |
CN114331416A (zh) * | 2021-12-30 | 2022-04-12 | 深圳市兆珑科技有限公司 | 数据处理的方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109871519A (zh) | 一种无层级结构的json反序列化方法、装置及存储介质 | |
CN103593194B (zh) | 对象序列化方法和装置 | |
KR101805946B1 (ko) | 입-출력 예시를 사용한 텍스트 조작 프로그램 생성 | |
CN104077335B (zh) | 一种结构化数据的序列化、反序列化方法、装置和*** | |
CN101146281A (zh) | 一种面向移动终端的创建图形用户界面模型 | |
US20150199378A1 (en) | Method and apparatus for realizing a dynamically typed file or object system enabling a user to perform calculations over the fields associated with the files or objects in the system | |
Stevenson et al. | A survey of grammatical inference in software engineering | |
Yan et al. | A spatially explicit reinforcement learning model for geographic knowledge graph summarization | |
CN114338855B (zh) | 一种实现hl7、fhir标准、自定义xml消息的解析生成方法 | |
CN107239492A (zh) | Xml文档转换为对象、对象转换为xml文档的方法及装置 | |
CN109889553A (zh) | 一种结构化报文自适应转换方法及装置 | |
CN110162297A (zh) | 一种源代码段自然语言描述自动生成方法及*** | |
CN113111135A (zh) | 一种知识图谱构建方法及装置 | |
CN116910213A (zh) | 一种基于深度强化学习的自动问答*** | |
CN109857458A (zh) | 基于ANTLR的AltaRica 3.0的扁平化的转化方法 | |
CN107526717A (zh) | 一种将结构化流程模型自动生成自然语言文本的方法 | |
CN105260561A (zh) | 一种复杂网络通用仿真*** | |
CN117193738A (zh) | 应用搭建方法、装置、设备及存储介质 | |
JP2016031567A (ja) | パーソナル情報匿名化装置 | |
CN104346393B (zh) | 原子级数据元素模型的建模方法 | |
CN109902434A (zh) | 云计算环境下面向rest架构风格的服务数据可视化建模与匹配方法 | |
CN115422902A (zh) | 基于模板生成问卷的方法及*** | |
US20180240356A1 (en) | Data-driven feedback generator for programming assignments | |
CN104834509B (zh) | 在电子病历编辑器中编辑医学矢量图的方法 | |
CN107016630A (zh) | 一种新型英语教学学习语言*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |