JSON数据解析方法、装置、计算机设备和存储介质与流程

文档序号:17538505发布日期:2019-04-29 14:16阅读:180来源:国知局
JSON数据解析方法、装置、计算机设备和存储介质与流程

本申请涉及软件开发技术领域,特别是涉及一种json数据解析方法、装置、计算机设备和存储介质。



背景技术:

json(javascriptobjectnotation,js对象标记)是一种轻量级的数据交换格式。应用程序(app)在开发过程中,开发人员需要对json数据进行解析,将json数据转换为java类(javabean)来进一步处理。

传统的解析方案,需要由开发人员提前开发一个java类(javabean),并利用编号好的javabean实现json数据的解析。而开发的java类通常针对正在开发的应用程序,涉及了应用程序相关的数据内容。

因此,传统的json数据解析方法的复用率低。



技术实现要素:

基于此,有必要针对复用率低的技术问题,提供一种json数据解析方法、装置、计算机设备和存储介质。

一种json数据解析方法,包括:

获取json数据;

解析所述json数据的数据结构,获取各json对象;

获取各json对象的键名以及与所述键名对应的键值;

根据所述键名将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,所述java类的字段名与对应json对象的所述键名对应;

根据所述键名在所述json对象中反射得到所述java类的各字段名的字段值。

一种json数据解析装置,包括获取模块、解析模块、键获取模块、转换模块和反射模块:

所述获取模块,用于获取json数据;

所述解析模块,用于解析所述json数据的数据结构,获取各json对象;

所述键获取模块,用于获取各json对象的键名以及与所述键名对应的键值;

所述转换模块,用于根据所述键名将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,所述java类的字段名与对应json对象的所述键名对应;

所述反射模块,用于根据所述键名在所述json对象中反射得到所述java类的各字段名的字段值。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上所述方法的步骤。

一种可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上所述方法的步骤。

上述的json数据解析方法,定义了json数据转换为javabean的规则,该规则仅涉及json结构,即通过解析json数据的数据结构,获取各json对象,并对各json对象进行转换得到java类。由于该规则基于数据结构出发,不涉及待开发的应用程序相关的内容,即与待开发的应用程序无关。因此,该json数据解析方法的应用范围不受限制,能够应用到各种应用软件的开发场景,具有较高的复用性。

附图说明

图1为一个实施例中json数据解析方法的应用环境图;

图2为一个实施例中json数据解析方法的流程示意图;

图3为一个实施例中解析json数据结构,获取各json对象的步骤的流程图;

图4为一个实施例中解析数组结构,获取子元素为对象的json对象的步骤的流程图;

图5为另一个实施例中为一个实施例中json数据解析方法的流程示意图;

图6为一个实施例中json数据解析装置的结构框图;

图7为另一个实施例中json数据解析装置的结构框图;

图8为一个实施例中计算机设备的结构框图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

图1为一个实施例中json数据解析方法的应用环境图。参照图1,该json数据解析方法应用于json数据解析系统。该json数据系统包括终端110和服务器120。终端110和服务器120通过网络连接,获取通过网络传输的json数据。终端110具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。

如图2所示,在一个实施例中,提供了一种json数据解析方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图2,该json数据解析方法具体包括如下步骤:

s202,获取json数据。

其中,json(javascriptobjectnotation,js对象标记)是一种轻量级的数据交换格式,json数据是指终端接收到的json格式的数据,比如,服务器通过网络通信模块发送的json数据等。可以理解的是,针对不同的应用场景,json数据的内容和来源不限。

s204:解析json数据的数据结构,获取各json对象。

json可以有两种表示结构:对象(jsonobject)和数组(jsonarray)。其中,对象以"{"大括号开始,以"}"大括号结束。中间部分由以","来分割开键值对(key/value)。关键字需要是字符串,而值可以是其他任何数据,比如:字符串,数值,布尔值,对象或者是null。

数组以"["方括号开始,"]"方括号结束,中中间部分由以","来分割对象。数组是子元素的有序集合,子元素的可采用对象和数组结构。每一个子元素一个索引值即子元素的下标。

本实施例中获取json对象应当是json数据中根结点json对象及数组中子元素json对象。

s206:获取各json对象的键名以及与键名对应的键值。

json键/值(即键名/键值)对是用来保存对象的一种方式。键/值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分隔,然后紧接着键值。例如,classname:”ace”,其中classname为键名,ace为键值。键值的数据类型包括数值型(integer)、长整型(long)、字符串型(string)、布尔类型(boolean)、浮点型(float)、双精度浮点型(double)。

本实施例中,获取各json对象的键名、与键名对应的键值以及键值的数据类型。

由于键名和键值有特殊的格式,可通过对该特殊格式前后的字符串进行分析,得到键名、键值和键值的数据类型。

具体地,通过字符串分析,获取各json对象的键名、与键名对应的键值以及键值的数据类型。

即利用json对象的键/值对的表达方式,分析”:”前后的字符串,得到对json对象的键名和与键名对应的键值,并分析得到键值的数据类型。

s208:根据键名将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,java类的字段名与对应json对象的键名对应。

javabean是一种java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。由于javabean是基于java语言的,因此javabean不依赖平台,具有可重复利用,易编写维护,可安装于java运行环境的平台上使用、不重要重新编译的优点。java类(javabean)是一种java语言写成的可重用组件,javabean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,属性名称符合这种模式,其他java类可以通过自省机制发现和操作这些javabean的属性。

java类的字段名(field)即数据处理的对象,java类的字段名与json对象的键名对应,即java类的字段名为json对象的键名。java字段名的数据类型与json对象的键值的数据类型对应,即java字段名的属性与json对象的键值的数据类型一致。一个实施例中字段名的属性与键值的数据类型对应关系表如表1所示。

表1字段名的属性与键值的数据类型对应关系表

s210:根据键名在json对象中反射得到java类的各字段名的字段值。

字段值即字段名对应的值。由于java类的各字段名与对应json对象的键名对应,因此,分别遍历各java类的各字段名,利用各字段名(即键名)在json对象中反射得到各字段名的字段值,从而将json数据解析复旦java格式的字段各和字段值,得到对应的java类,开发人员可以直接使用解析后的java类进行开发。

上述的json数据解析方法,定义了json数据转换为javabean的规则,该规则仅涉及json结构,即通过解析json数据的数据结构,获取各json对象,并对各json对象进行转换得到java类。由于该规则基于数据结构出发,不涉及待开发的应用程序相关的内容,即与待开发的应用程序无关。因此,该json数据解析方法的应用范围不受限制,能够应用到各种应用软件的开发场景,具有较高的复用性。

具体地,一个实施例中,解析json数据结构,获取各json对象的步骤的流程图如图3所示,该步骤包括以下步骤s302至步骤s306:

s302:通过json数据的数据结构对应的特殊格式符,识别得到json数据的数据结构。

特殊格式符为该数据结构中特有的符号,基于该特殊格式符,能够识别对应的数据结构。

具体地,json对象(jsonobject)是以“{}”包裹起来的对象,通过识别“{}”符号,确定数据结构为java对象。

而json数组(jsonarray)则是以“[]”包裹起来的数组,通过识别“[]”符号,确定数据结构为java数组。

s304:当数据结构为对象时,获取json对象。

此处的json对象为根节点json对象,即不是嵌套在json数组中的json对象。

s306:当数据结构为数组时,解析数组结构,获取子元素为对象的json对象。

json数组是子元素的有序集合,每个子元素都有一个索引值(即下标),子元素的数据结构可以为json对象,也可以为json数组,通过解析json数组,获取子元素为对象的json对象。可以理解的是,获取的子元素为对象的json对象应当包括json数组中所有的json对象,即包括多重嵌套的所有子元素为对象的json数据。

具体地,解析数组结构,获取子元素为对象的json对象的步骤的流程图如图4所示,该步骤包括以下步骤s402至步骤s406:

s402:针对数组,解析数据结构。

json数组可以嵌套json对象和json数组,即子元素的数据结构可以为json对象,也可以为json数组,json对象(jsonobject)是以“{}”包裹起来的对象,通过识别“{}”符号,确定子元素的数据结构为java对象。而json数组(jsonarray)则是以“[]”包裹起来的数组,通过识别“[]”符号,确定子元素的数据结构为java数组。解析数组结构的方法与json数据的数据结构解析方相同,基于数组结构对应的特殊格式符,识别得到json数据的数据结构。

s404:判断数组的子元素的类型。

当数组的子元素为子对象时,执行步骤s406:获取子元素为对象的json对象。

当数组的子元素为子数组时,返回步骤s402:针对数组,解析数组结构。

即当json数组嵌套json数组时,返回针对数组,解析数组结构的步骤,直至遍历完该数组。

在解析得到json对象后,获取各json对象的键名、与键名对应键值以及键值的数据类型,并根据键名和键值的数据类型,将各json对象进行转换,即针对每一json对象,对应一个java类。针对数组,其转换过程包括以下三种情况:

1、子元素为基础类型,即子元素为数值型(integer)、长整型(long)、字符串型(string)、布尔类型(boolean)、浮点型(float)、双精度浮点型(double)等,根据表1所示的字段名的属性与键值的数据类型对应关系表进行强制转换。

2、子元素为对象(jsonobject),则根据键名和键值的数据类型,将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,java类的字段名与对应json对象的键名对应,java类的字段名的数据类型与json对象的键值的数据类型对应。

3、子元素为数组(jsonarray),则重新就该子数组的子元素的结构进行解析,根据上述的第一种情况和第二种情况进行转换。

子元素为数组时,由于jsonarray里的jsonarray不具有键值,为便于转换,本实施例中将父数组的键值和子数组的索引值作为的子数据的键名。

具体地,请继续参阅图4,当数组的子元素为子数组时,执行步骤s408:根据对应的父数组的键值和子数组的索引值得到子数据的键名。并在步骤s408之后,返回步骤s402,针对数组,解析数组结构。

而在实际应用中,数组的子元素可能包括至少一个或多个子对象,而子对象可能没有键名,则在转换的过程中,根据键名将各json对象进行转换,得到各json对象对应的java类及java类的各字段名的步骤包括以下步骤s1至s3:

s1:将数组的所有子对象转换成一个java类。

s2:根据父数组的键名确定各不具有键值的子对象的键名。

父数组即子元素的上一节点对应的数组,即根据父数组的键名确定各不具有键值的子对象的键名。在具体的实施方式中,不具有键值的子对象的键名即其父数组的键名。

s3:分别根据子对象的键名和子对象对应的索引值得到java类中各索引值对应的字段名。

即各索引值分别具有各自的字段名,且字名段应当包括子对象的全部属性,即子对象的键名和子对象的索引值。在其它的实施方式中,若子对象还具有其它的属性,该索引值对应的字段名,应当也全部包括,避免因遗漏属性,不能正确地反射得到该字段名对应的字段值的情况。

对于数组的子元素的具有键值的子对象,根据对象的转换规则进行转换,即根据键名和键值的数据类型,将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,java类的字段名与对应json对象的键名对应,java类的字段名的数据类型与json对象的键值的数据类型对应。

上述的方法,通过对不具有键名的情况进行分析并定义了对应的键名,避免因遗漏属性,不能正确地反射得到该字段名对应的字段值的情况。

在一个实施例中,一种json数据解析方法的流程图如图5所示。应该理解的是,虽然图5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

具体地,该方法包括以下步骤:

s502:获取json数据。

s504:通过json数据的数据结构对应的特殊格式符,识别得到json数据的数据结构。

特殊格式符为该数据结构中特有的符号,基于该特殊格式符,能够识别对应的数据结构。

具体地,json对象(jsonobject)是以“{}”包裹起来的对象,通过识别“{}”符号,确定数据结构为java对象。

而json数组(jsonarray)则是以“[]”包裹起来的数组,通过识别“[]”符号,确定数据结构为java数组。

s506:当数据结构为对象时,获取json对象。

此处的json对象为根节点json对象,即不是嵌套在json数组中的json对象。

s508:当数据结构为数组时,针对数组,解析数组结构。

json数组可以嵌套json对象和json数组,即子元素的数据结构可以为json对象,也可以为json数组。

s510:判断数组的子元素的类型。若是对象,则执行步骤s512,若则数组,则执行步骤s514。

s512:获取子元素为对象的json对象。

s514:根据对应的父数组的键值和子数组的索引值得到子数据的键名。

步骤s514之后,返回步骤s508。

步骤s512和步骤s506之后,还包括步骤:

s516:获取各json对象的键名、与键名对应的键值以及键值的数据类型。

具体地,通过字符串分析,获取各json对象的键名、与键名对应的键值以及键值的数据类型。

s518:根据键名和键值的数据类型,将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,java类的字段名与对应json对象的键名对应,java类的字段名的数据类型与json对象的键值的数据类型对应。

其中,当数组的子元素包括不具有键值的子对象时,根据键名和键值的数据类型,将各json对象进行转换,得到各json对象对应的java类及java类的各字段名的步骤包括以下步骤s1至s3:

s1:根据键值的数据类型,将数组的所有的不具有键值的子对象转换成一个java类。

s2:根据父数组的键名确定各不具有键值的子对象的键名。

s3:分别根据子对象的键名和子对象对应的索引值得到java类中各索引值对应的字段名。

s520:根据键名在json对象中反射得到java类的各字段名的字段值。

上述的实施例中,定义了json数据转换为javabean的规则,该规则仅涉及json结构,即通过解析json数据的数据结构,获取各json对象,并对各json对象进行转换得到java类。由于该规则基于数据结构出发,不涉及待开发的应用程序相关的内容,即与待开发的应用程序无关。因此,该json数据解析方法的应用范围不受限制,能够应用到各种应用软件的开发场景,具有较高的复用性为进一步的提高开发效率,基于该json数据解析方法的程序提供api接口。通过调用api接口,各种json内容都能够自动解析与javabean赋值,实现了任意json内容到javabean的转化,开发人员可以直接使用解析后的javabean进行开发,提高了开发效率。

在一个实施例中,提供一种json数据解析装置,如图6所示,包括获取模块602、解析模块604、键获取模块606、转换模块608和反射模块610。

获取模块602,用于获取json数据。

解析模块604,用于解析json数据的数据结构,获取各json对象。

键获取模块606,用于获取各json对象的键名以及与键名对应的键值。

转换模块608,用于根据键名将各json对象进行转换,得到各json对象对应的java类及java类的各字段名,java类的字段名与对应json对象的键名对应。

反射模块610,用于根据键名在json对象中反射得到java类的各字段名的字段值。

上述的json数据解析装置,定义了json数据转换为javabean的规则,该规则仅涉及json结构,即通过解析json数据的数据结构,获取各json对象,并对各json对象进行转换得到java类。由于该规则基于数据结构出发,不涉及待开发的应用程序相关的内容,即与待开发的应用程序无关。因此,该json数据解析方法的应用范围不受限制,能够应用到各种应用软件的开发场景,具有较高的复用性。

图7为另一个实施例的json数据解析装置的结构示意图。如图7所示,解析模块604包括:数据结构获取模块和对象获取模块。

其中,数据结构识别模块、用于通过json数据的数据结构对应的特殊格式符,识别得到json数据的数据结构。

对象获取模块,用于当数据结构为对象时,获取json对象;当数据结构为数组时,解析数组结构,获取子元素为对象的json对象。

在再一个实施例中,数据结构识别模块,还用于针对数组,解析数组结构,还用于在数组的子元素为子数组时,针对数组解析数组结构。

对象获取模块,还用于当数组的子元素为子对象时,获取子元素为对象的json对象。

以又一个实施例中,转换模块608,还用于将数组的所有的不具有键值的子对象转换成一个java类,根据父数组的键名确定各不具有键值的子对象的键名,并分别根据子对象的键名和子对象对应的索引值得到java类中各索引值对应的字段名。

在一个实施例中,、根据权利要求9的装置,其特征在于,键获取模块606,还用于当数组的子元素为子数组时,根据对应的父数组的键值和子数组的索引值得到子数据的键名。

在又一个实施例中,键获取模块,还用于通过字符串分析,获取各json对象的键名以及与键名对应的键值。

一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述方法的步骤。

图8示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图8所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现json数据解析方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行json数据解析方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图8中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,本申请提供的json数据解析装置可以实现为一种计算机程序的形式,计算机程序可在如图8所示的计算机设备上运行。计算机设备的存储器中可存储组成该json数据解析装置的各个程序模块,比如,图6所示的获取模块、解析块和转换模块。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的json数据解析方法中的步骤。

例如,图8所示的计算机设备可以通过如图6所示的json数据解析装置中的获取模块执行获取json数据的步骤。计算机设备可通过转换模块执行根据所述键名将各json对象进行转换,得到各jso的步骤。

一种可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行上述方法的步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

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