JSON字符串处理方法及装置与流程

文档序号:18739757发布日期:2019-09-21 01:38阅读:153来源:国知局
JSON字符串处理方法及装置与流程
本公开通常涉及计算机应用技术,更具体地,涉及JSON字符串处理方法及装置。
背景技术
:目前直接用于分析使用的数据往往是结构化的,结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,需要严格遵循数据格式规范,主要通过关系型数据库存储与管理。与之对应的非结构化数据是数据结构不规则或不完整、没有预定义的数据模型、无法用关系模型展现的数据。在常规业务系统中,数据由系统需求而定义,在接口调用、参数传递、返回值、网络传输中数据的交互通常是通过类(class)来承载的,进而通过日志、拦截器等方式将这些类以字符串的形式记录下来便形成了最常见的半结构化JSON数据。JSON是一种轻量级的数据交换格式,以完全独立于编程语言的文本格式来存储和表示数据,简洁和清晰的层次结构使得JSON成为理想的数据交换语言。正是由于存在大量以JSON承载的数据,而且这类半结构化数据难以直接利用,只有完整、规范、通用地将这种数据结构化存储下来,才能高效地处理与分析这种数据,以充分利用数据资产。目前对于半结构化JSON数据的处理通常是映射成对应类的对象,再通过访问器直接在对象中取值。另一种是通过特定格式,按照JSON中的索引,直接在字符串中匹配。但是,这两种现有解决方案对于处理JSON数据都存在不足。前一种现有解决方案需要有特定的类定义,每一种类型都需要引用指定的定义,若存在数量众多类型的JSON则需要引用很多类的定义,类型加载繁琐,这往往给数据处理者造成困扰。后一种现有解决方案是通过匹配的方法,为了精确到某一具体值往往需要更多的附加条件,因为JSON中取一种键(key)对应的值(value)通常会出现在多个地方,因此后一种现有解决方案准确性低。技术实现要素:鉴于上述问题,本公开提供了一种JSON字符串处理方法及装置。该方法及装置对中间状态的JSON对象(JsonObject)数据提取分类,并按照键名称索引键值将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字符串的所述元素中的各个底层元素,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称以及所述元素在所述对应上层元素中的所述排列顺序,生成该底层元素的索引。可选地,在上述方面的一个示例中,所述JSON字符串处理装置还包括:类型确定单元,被配置为在每次反序列化处理时,确定当前待反序列化处理数据的JSON类型;以及反序列化算法选择单元,被配置为在每次反序列化处理时,基于所确定的当前待反序列化处理数据的JSON类型,选择匹配的反序列化算法,其中,所述反序列化单元被配置为使用所选择的反序列化算法来对所述当前待反序列化处理数据进行反序列化处理,以得到所述当前反序列化处理结果。可选地,在上述方面的一个示例中,所述JSON字符串处理装置还包括:反序列化优化算法选择单元,被配置为在每次反序列化处理时,基于所确定的当前待反序列化处理数据的JSON类型,选择匹配的反序列化优化算法;以及优化处理单元,被配置为在每次反序列化处理时,使用所选择的反序列化优化算法来对所述当前反序列化处理结果进行优化处理。可选地,在上述方面的一个示例中,所述JSON字符串处理装置还包括:预处理单元,被配置为在对所述JSON字符串进行反序列化处理之前,替换和/或去除所述JSON字符串中的异常字符。根据本公开的又一方面,还提供一种计算设备,包括:一个或多个处理器,以及与所述一个或多个处理器耦合的存储器,所述存储器存储指令,当所述指令被所述一个或多个处理器执行时,使得所述至少一个处理器执行如上所述的JSON字符串处理方法。据本公开的再一方面,还提供一种机器可读存储介质,其存储有可执行指令,所述指令当被执行时使得所述机器执行如上所述的JSON字符串处理方法。本公开的实施例的JSON字符串处理方法及装置对中间状态的JsonObject数据提取分类,使原始JSON字符串能够结构化存储下来,相对于现有技术来说,不需要引用类定义和更新引用类,避免了类型加载繁琐的问题。本公开的实施例的JSON字符串处理方法及装置按照键名称索引键值将JSON信息分解以结构化的方式存储在基本的关系数据库中,进而使半结构化数据的利用成为可能,相对于现有技术来说,避免了准确性低的问题。本公开的实施例的JSON字符串处理方法及装置中,索引是唯一的,可以把每个键值都标记成一个有唯一索引的索引-键值对,能够精确地将数据存储下来,同时便于后续分析和提取。此外,利用根据本公开的实施例的JSON字符串处理方法及装置,使过程中产生的JSON字符串结构化、扁平化、按数据索引形式存储于数据库中,同时对JSON数据形式、长短、复杂度无任何限制,为后续业务特征提取、定位、参数比对等提供了直接且高性能的途径。实现了完整、规范、通用地解析任意类型的JSON字符串的能力。附图说明通过参照下面的附图,可以实现对于本公开内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。图1A、图1B和图1C分别示出对象类型、数组类型和多层嵌套的JSON字符串的一个例子;图2示出了根据本公开的实施例1的JSON字符串处理方法的流程图;图3示出了根据一个示例的对于对应上层元素的键值是数组类型的JSON字符串的元素进行处理的流程图;图4示出了根据本公开的实施例2的JSON字符串处理方法的流程图;图5示出了根据本公开的一个实施例的JSON字符串处理装置的结构示意图;图6示出了根据本公开的另一个实施例的JSON字符串处理装置的结构示意图;以及图7为根据本公开的实施例的用于JSON字符串处理的计算设备的结构框图。具体实施方式现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本公开内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。JSON字符串包括两种数据结构。一种是对象,对象是一个无序的“‘键名称/键值’对”集合。花括号“{}”表示一个对象。每个“键名称”后跟一个冒号“:”,“‘键名称/键值’对”之间使用逗号“,”分隔,比如,图1A所示的例子。另一种是数组,数组由有序的组成元素构成,组成元素可以是键值。方括号“[]”表示一个数组,比如,图1B所示的例子,图1B所示的例子表示一个数组里面存了n个组成元素。因此,在本文中,将花括号“{}”或方括号“[]”包裹起来的部分作为JSON字符串。在本文中,多层嵌套的JSON字符串是指JSON字符串中至少有一个键名称/键值对中的键值包括字符串,比如,图1C所示的例子。在本文中,术语“元素”指键名称/键值对。术语“底层元素”包括底层键名称和对应的第一键值,第一键值中不包括JSON字符串。术语“非底层元素”包括键名称和第二键值,第二键值是JSON字符串。在本文中,术语“反序列化”是指对JSON字符串进行解析处理从而提取出元素的过程。反序列化处理采用反序列化工具中的反序列化算法执行,反序列化工具可以利用多种开源包,一般包括Gson、fastjson和jackson。反序列化处理后的数据可以被读取,以对数据进行后续处理。本公开将JSON字符串转化成树状JSON对象,根据JSON对象类型结构深度优先递归,在叶子节点记录索引与键值,也就是记录底层元素的索引与键值,从而进行结构化存储。图2示出了根据本公开的实施例1的JSON字符串处理方法的流程图。如图2所示,在块210,将JSON字符串作为当前待反序列化处理数据。假设这条JSON字符串为“{a:1,b:2,c:3,d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]}”。在块220,对当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果。在块230,从当前反序列化处理结果中提取出元素。比如从{a:1,b:2,c:3,d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]}迭代提取出所有4个元素a:1、b:2、c:3、以及d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]。在块240,判断提取出来的元素中是否存在非底层元素,非底层元素包括键名称和第二键值,第二键值是JSON字符串。底层元素包括底层键名称和对应的第一键值,第一键值不包括JSON字符串。如果存在非底层元素,则流程进行到块250。如果不存在非底层元素,即只存在底层元素,则流程进行到块260。至于如何判断提取出来的元素是非底层元素还是底层元素,作为一种可选的实施方式,可以通过查找元素中是否有花括号{}或方括号[]的方式判断,也就是判断提取出来的元素中是否含有JSON字符串。如果元素包含花括号{}和/或方括号[],即包含JSON字符串,则为非底层元素。如果元素中既没有花括号也没有方括号,即不包含JSON字符串,则确定为底层元素。比如上述提取出来的4个元素中d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]为非底层元素,a:1、b:2和c:3均为底层元素。在块250,将所存在的至少一个非底层元素的第二键值作为下一循环处理过程的当前待反序列化处理数据。如果当前反序列化处理结果包括多个非底层元素,则分别将各个非底层元素的第二键值作为当前待反序列化处理数据返回块220进行循环处理。由于反序列化处理一次只能转换JSON字符串的最上一层,因此对于JSON字符串是多层嵌套字符串的情况,也就是第一次反序列化处理的结果中提取出来的元素中存在非底层元素的情况,需要对JSON字符串循环进行反序列化处理,可以直到提取出JSON字符串中的所有底层元素时循环结束。作为一种可选实施方式,可以通过递归方式进行循环处理。当然,对于只有一层的JSON字符串,反序列化处理一次即可以提取出所有底层元素,不需要循环处理。循环处理过程的第一次反序列化处理的对象是JSON字符串,进而循环处理过程的后续反序列化处理的对象则是从JSON字符串中提取出来的非底层元素中的第二键值。例如,将非底层元素d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的第二键值[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]返回块220进行循环处理。再例如,将非底层元素{a1:{a2:222,a3:333}}中的第二键值{a1:{a2:222,a3:333}}返回块220进行循环处理。在块260,针对各个底层元素,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称,生成该底层元素的索引。对于只有一层的JSON字符串,针对各个底层元素,只要基于该底层元素的底层键名称,就可以生成该底层元素的索引。在块270,基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。可以将各个底层元素的索引以及对应的键值逐对记录到数据库中并且/或者存储到内存中,以得到结构化存储的数据。作为一种可选实施方式,如果经过当前的反序列化处理既提取出底层元素又提取出非底层元素,则对提取出来的底层元素执行块260~块270的处理可以与对提取出来的非底层元素执行的下一次反序列化处理并列进行。作为另一种可选实施方式,可以等到反序列化处理循环完毕得到所有的底层元素之后,在对提取出来的所有的底层元素执行块260~块270的处理。作为该实施例的一方面,如果在当前反序列化处理过程中所得到的元素的对应上层元素的键值是数组类型的JSON字符串并且该键值包括至少一个子元素,则该元素中各个底层元素的索引还可以包括与该元素在其对应上层元素中的排列顺序相关的信息。在该键值只包括一个子元素的情况下,该元素中各个底层元素的索引可以不包括与该元素在其对应上层元素中的排列顺序相关的信息。1)上述块220~块250第一次循环处理提取出四个元素a:1、b:2、c:3和d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]。其中,a:1、b:2和c:3是底层元素,d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]是非底层元素,将这个非底层元素的第二键值[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]代入第二次循环。2)第二次循环处理提取出四个元素a1:11、a2:22、a3:33和a1:{a2:222,a3:333}。其中,a1:11、a2:22和a3:33是底层元素,a1:{a2:222,a3:333}是非底层元素,将这个非底层元素的第二键值{a2:222,a3:333}代入第三次循环。3)第三次循环处理提取出两个元素a2:222和a3:333。这两个元素都是底层元素。最后得到底层元素的索引与底层元素的键值对应存储的结构化数据的例子如下:索引键值a1b2c3d[0].a111d[0].a222d[0].a333d[1].a1.a2222d[1].a1.a3333这里,索引中的d[0]表示{a1:11,a2:22,a3:33}是数组[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的第一个组成元素,索引中的d[1]表示{a1:{a2:222,a3:333}}是数组[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的第二个组成元素。需要说明的是,这里虽然采用数字在方括号中的表示方式,这只是一个示例,表示方式不受限制,比如也可以采用数字在圆弧括号中的表示方式。图3示出了根据一个示例的对于对应上层元素的键值是数组类型的JSON字符串的元素进行处理的流程图。图3只考虑对应上层元素的键值是数组类型JSON字符串的一个元素,并且只示出了从当前待反序列化处理数据为数组类型的JSON字符串开始一直到该数组类型的JSON字符串生成结构化数据的处理过程。以元素是{a1:{a2:222,a3:333}}而且元素{a1:{a2:222,a3:333}}的对应上层元素是d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]为例,假设JSON字符串经过第一次反序列化处理后提取出来的元素中一个元素为d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]。如图3所示,在块310,判断当前待反序列化处理数据比如[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]的JSON类型。作为该实施例的一方面,JSON字符串的JSON类型包括数组类型和对象类型中的至少一种。可以在解析JSON字符串的过程中判断当前匹配的类型,例如如果遇到左半个花括号{,则将其判断为对象类型的起始位置;如果遇到左半个方括号[,则将其判断为数组类型的起始位置。如果JSON类型为数组类型,则流程进行到块320。如果JSON类型为对象类型,则流程进行到块330。在块320,对数组类型的当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果,从当前反序列化处理结果中提取出元素以及该元素在对应上层元素中的排列顺序。比如从[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中提取出元素{a1:11,a2:22,a3:33}和{a1:{a2:222,a3:333}},元素{a1:11,a2:22,a3:33}在[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的排列顺序用数字0表示,元素{a1:{a2:222,a3:333}}在[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的排列顺序用数字1表示。流程进行到块340。在块330,对对象类型的当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果,从当前反序列化处理结果中提取出元素。流程进行到块340。在块340,判断提取出来的元素中是否存在非底层元素,非底层元素包括键名称和第二键值,第二键值是JSON字符串。底层元素包括底层键名称和对应的第一键值,第一键值不包括JSON字符串。如果存在非底层元素,则流程进行到块350。如果不存在非底层元素,则流程进行到块360。在块350,将所存在的至少一个非底层元素的第二键值作为当前待反序列化处理数据返回块310进行循环处理。在块360,针对对应上层元素的键值是数组类型JSON字符串的元素比如{a1:{a2:222,a3:333}}中的各个底层元素比如a2:222和a3:333,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称、以及该元素比如{a1:{a2:222,a3:333}}在其对应上层元素d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]中的排列顺序,生成该底层元素的索引,比如a2:222的索引为d[1].a1.a2,a3:333的索引为d[1].a1.a3。在块370,基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。可以生成例如下面所示的结构化数据:索引键值d[1].a1.a2222d[1].a1.a3333图4示出了根据本公开的实施例2的JSON字符串处理方法的流程图。如图4所示,在块405,对JSON字符串进行预处理。由于反序列化工具无法识别进而无法反序列化非标准的JSON字符,因此为了避免反序列化处理出错,可以将JSON字符串预处理为更加标准的JSON字符串。预处理可以包括替换和/或去除字符串中的异常字符。例如,将异常的冒号替换为符合JSON标准的冒号。再例如,将[]替换成“[null]”,并且/或者将{}替换成字符串“{null}”。因此,解决了序列化工具和反序列化工具不同所导致的不兼容的问题。作为一种可选实施方式,可以对多条JSON字符串进行全局预处理。作为另一种可选实施方式,可以对一条一条的JSON字符串分别进行预处理。当然,也可以不进行预处理,直接对JSON字符串进行反序列化处理,只是反序列化工具对于非标准的JSON字符反序列化的过程中会出错,只对标准的JSON字符串进行正常的反序列化处理。在块410,将预处理后的JSON字符串作为当前待反序列化处理数据。在块415,判断当前待反序列化处理数据的JSON类型。作为该实施例的一方面,JSON字符串的JSON类型包括数组类型和对象类型中的至少一种。在块420,基于所确定的JSON类型,选择匹配的反序列化算法。如果确定当前待反序列化处理数据是对象类型的JSON字符串,则可以从反序列化工具中选择与对象类型匹配的反序列化算法比如parseObject算法。如果确定反序列化处理的目标数据是数组类型的JSON字符串,则可以从反序列化工具中选择与数组类型匹配的反序列化算法比如parseArray算法。在块425,使用所选择的反序列化算法来对当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果。如果确定当前待反序列化处理数据是对象类型,则可以使用所选择的反序列化算法比如parseObject算法将当前待反序列化处理的数据反序列化为JSON对象(JsonObject)数据。如果确定当前待反序列化处理数据是数组类型,则可以使用所选择的反序列化算法比如parseArray算法将当前待反序列化处理的数据反序列化为JSON数组(JsonArray)数据。在块430,基于所确定的JSON类型,选择匹配的反序列化优化算法。通常,反序列化工具还包括反序列化优化算法,可以从反序列化工具中选择与当前待反序列化处理数据的JSON类型匹配的反序列化优化算法。如果确定当前待反序列化处理数据是对象类型,则可以从反序列化工具中选择与对象类型匹配的反序列化优化算法。如果确定当前待反序列化处理数据是数组类型,则可以从反序列化工具中选择与数组类型匹配的反序列化优化算法。在块435,使用所选择的反序列化优化算法对当前反序列化处理结果进行优化处理,以得到当前反序列化优化处理结果。如果确定当前待反序列化处理数据是对象类型,则可以使用所选择的反序列化优化算法将JSON对象数据优化为Map类型数据,以从Map类型数据中提取元素。如果确定当前待反序列化处理数据是数组类型,则可以利用所选择的反序列化优化算法将JSON数组数据优化为List类型数据,以从List类型数据中提取出元素。Map类型数据的形式与JasonObject数据的形式相似,List类型数据的形式与JsonArray数据的形式相似。JasonObject数据和JsonArray数据是一种转化的半成品,没有提供访问其中元素的算法,需要编写程序语句访问其中元素,而Map和List是一种计算机语言中的基础数据结构,以键名称-键值形式组织,提供了访问其中元素的算法,可以直接利用所提供的算法提取其中的元素。可见,Map类型数据和List类型数据更便于提取元素,方便后续数据处理。其中,块425和块430的顺序可以交换,作为替换方式,块425和块430也可以并列执行。当然,作为一种可选实施方式,可以不执行块430和块435的反序列化的优化处理,在块425得到当前反序列化处理结果后即从JSON对象数据和/或JSON数组数据中提取出元素。在块440,从当前反序列化优化处理结果中提取出元素。作为一种可选实施方式,可以采用迭代方式从当前反序列化优化处理结果中提取出所有元素。对于只进行反序列化处理而不进行反序列化之后的优化处理的实施方式,则从当前反序列化处理结果中提取出元素。对于进行反序列化处理后又进行优化处理的实施方式,则从当前反序列化优化处理结果中提取出元素。在块445,判断提取出来的元素中是否存在非底层元素,非底层元素包括键名称和第二键值,第二键值是JSON字符串。底层元素包括底层键名称和对应的第一键值,第一键值不包括JSON字符串。如果存在非底层元素,则流程进行到块450。如果不存在非底层元素,则流程进行到块455。作为一种可选的实施方式,可以通过查找元素中是否有花括号{}或方括号[]来判断各个元素是否为非底层元素,如果元素中有花括号和方括号中至少一种括号,则确定为非底层元素,否则为底层元素。在块450,将所存在的至少一个非底层元素的第二键值作为当前待反序列化处理数据返回块415进行循环处理。在块455,针对各个底层元素,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称,生成该底层元素的索引。在块460,基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。对于多条JSON字符串可以逐条执行上述块405至块460,作为一种替换方式,也可以对于多条JSON字符串并列执行上述块405至块460,作为另一种替换方式,还可以对多条JSON字符串执行块405的全局预处理,然后对于预处理后的多条JSON字符串逐条或并列执行上述块410至块460。本公开的实施例的JSON字符串处理方法及装置对中间状态的JsonObject数据提取分类,使原始JSON字符串能够结构化存储下来,相对于现有技术来说,不需要引用类定义和更新引用类,避免了类型加载繁琐的问题。本公开的实施例的JSON字符串处理方法及装置按照键名称索引键值将JSON信息分解以结构化的方式存储在基本的关系数据库中,进而使半结构化数据的利用成为可能,相对于现有技术来说,避免了准确性低的问题。本公开的实施例的JSON字符串处理方法及装置中,索引是唯一的,可以把每个键值都标记成一个有唯一索引的索引-键值对,能够精确地将数据存储下来,同时便于后续分析和提取。此外,利用根据本公开的实施例的JSON字符串处理方法及装置,使过程中产生的JSON字符串结构化、扁平化、按数据索引形式存储于数据库中,同时对JSON数据形式、长短、复杂度无任何限制,为后续业务特征提取、定位、参数比对等提供了直接且高性能的途径。实现了完整、规范、通用地解析任意类型的JSON字符串的能力。图5示出了根据本公开的一个实施例的JSON字符串处理装置500的结构示意图。如图5所示,JSON字符串处理装置500包括反序列化单元510、索引生成单元520、以及结构化数据生成单元530。反序列化单元510被配置为对JSON字符串进行反序列化处理,以提取出JSON字符串中的底层元素,底层元素包括底层键名称和对应的第一键值。反序列化单元510的操作可以参照上面参考图2描述的块220~块250的操作。索引生成单元520被配置为针对提取出来的各个底层元素,基于该底层元素的底层键名称生成该底层元素的索引。索引生成单元520的操作可以参照上面参考图2描述的块260的操作。结构化数据生成单元530被配置为基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。结构化数据生成单元530的操作可以参照上面参考图2描述的块270的操作。作为一种可选的实施方式,JSON字符串处理装置500还可以包括预处理单元。预处理单元被配置为在对JSON字符串进行反序列化处理之前,替换和/或去除JSON字符串中的异常字符。预处理单元的操作可以参照上面参考图4描述的块405的操作。图6示出了根据本公开的另一个实施例的JSON字符串处理装置600的结构示意图。如图6所示,JSON字符串处理装置600包括类型确定单元610、反序列化算法选择单元620、反序列化单元630、索引生成单元640、以及结构化数据生成单元650。在JSON字符串是多层嵌套字符串的情况下,反序列化单元630被配置为对JSON字符串循环进行下述反序列化处理,以提取出JSON字符串中的底层元素:对当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果;从当前反序列化处理结果中提取出元素,提取出的元素包括底层元素和/或非底层元素,非底层元素包括键名称和第二键值,第二键值是JSON字符串;以及在当前反序列化处理结果包括至少一个非底层元素时,将该至少一个非底层元素的第二键值作为下一循环处理过程的当前待反序列化处理数据。反序列化单元630的操作可以参照上面参考图2描述的块220~块250的操作。类型确定单元610被配置为在每次反序列化处理时,确定当前待反序列化处理数据的JSON类型。JSON类型包括对象类型和数组类型中的至少一种类型。类型确定单元610的操作可以参照上面参考图4描述的块415的操作。反序列化算法选择单元620被配置为在每次反序列化处理时,基于所确定的当前待反序列化处理数据的JSON类型,选择匹配的反序列化算法。反序列化算法选择单元420的操作可以参照上面参考图4描述的块415的操作。反序列化单元630进一步被配置为使用所选择的反序列化算法来对当前待反序列化处理数据进行反序列化处理,以得到当前反序列化处理结果。反序列化单元630的操作可以参照上面参考图4描述的块425的操作。作为一种可选实施方式,JSON字符串处理装置600还可以包括反序列化优化算法选择单元和优化处理单元。反序列化优化算法选择单元被配置为在每次反序列化处理时,基于所确定的当前待反序列化处理数据的JSON类型,选择匹配的反序列化优化算法。反序列化优化算法选择单元的操作可以参照上面参考图4描述的块430的操作。优化处理单元被配置为在每次反序列化处理时,使用所选择的反序列化优化算法来对当前反序列化处理结果进行优化处理。优化处理单元的操作可以参照上面参考图4描述的块435的操作。反序列化单元630进一步被配置为使用所选择的反序列化优化算法来对当前反序列化处理结果进行优化处理,以得到当前反序列化优化处理结果。反序列化单元630的操作可以参照上面参考图4描述的块435的操作。索引生成单元640被配置为针对提取出来的各个底层元素,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称,生成该底层元素的索引。索引生成单元640的操作可以参照上面参考图2描述的块260的操作。结构化数据生成单元650被配置为基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。结构化数据生成单元650的操作可以参照上面参考图2描述的块270的操作。作为该实施例的一方面,在当前反序列化处理过程中所得到的元素的对应上层元素的键值是数组类型的JSON字符串并且该键值包括至少一个子元素时,反序列化单元630被配置为从当前反序列化处理结果中提取出元素以及该元素在对应上层元素中的排列顺序。反序列化单元630的操作可以参照上面参考图3描述的块310~块350的操作。索引生成单元640被配置为针对对应上层元素的键值是数组类型JSON字符串的元素中的各个底层元素,基于提取该底层元素所需的各个反序列化处理过程中所得到的各个元素的键名称以及该元素在其对应上层元素中的排列顺序,生成该底层元素的索引。索引生成单元640的操作可以参照上面参考图3描述的块360的操作。图7为根据本公开的实施例的用于JSON字符串处理的计算设备的结构框图。如图7所示,计算设备700可以包括至少一个处理器710、存储器720、内存730、通信接口740以及内部总线750,并且至少一个处理器710、存储器720、内存730和通信接口740经由总线750连接在一起。该至少一个处理器710执行在计算机可读存储介质(即,存储器720)中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。在一个实施例中,在存储器720中存储有计算机可执行指令,其当执行时使得至少一个处理器710:对JSON字符串进行反序列化处理,以提取出该JSON字符串中的底层元素,底层元素包括底层键名称和对应的第一键值;针对底层元素中的各个底层元素,基于该底层元素的底层键名称生成该底层元素的索引;以及基于所生成的各个底层元素的索引以及对应的第一键值,生成结构化数据。应该理解的是,在存储器720中存储的计算机可执行指令当执行时使得至少一个处理器710进行本公开的各个实施例中以上结合图1A-1C以及图2-图6描述的各种操作和功能。在本公开中,计算设备700可以包括但不限于:个人计算机、服务器计算机、工作站、桌面型计算机、膝上型计算机、笔记本计算机、移动计算设备、智能电话、平板计算机、蜂窝电话、个人数字助理(PDA)、手持装置、消息收发设备、可佩戴计算设备、消费电子设备等等。根据一个实施例,提供了一种例如非暂时性机器可读介质的程序产品。非暂时性机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本公开的各个实施例中以上结合图1A-1C以及图2-图6描述的各种操作和功能。具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD-RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,FPGA或ASIC)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1