一种强类型静态编程语言JSON解析方法与流程

文档序号:25875240发布日期:2021-07-16 17:35阅读:132来源:国知局
一种强类型静态编程语言JSON解析方法与流程
一种强类型静态编程语言json解析方法
技术领域
1.本发明涉及软件技术数据解析领域,具体涉及一种json格式数据解析存储方法。


背景技术:

2.在现在编程开发中,任何强类型编程语言如c/c++、java、dart、objective

c等等,因为强类型语言需要预先确认变量静态类型,所以在解析json字符串的时候目前主流只有两种很麻烦的技术方案,以java语言为例:
3.1,使用jsonobject类解析json字符串方式,类库将json字符串转为map、list之类的容器接收。此种方式的缺点为使用非常麻烦,而且类型会不容易确定,并且不安全,所以在使用数据的时候需要做大量的if判断,防止代码获取到空数据,或者类型不匹配,特别是当json的层级深了之后充斥的if判断简直就是噩梦,既非常影响代码质量,又影响非常开发效率;
4.2,使用gson类解析json字符串方式,此方式相比较jsonobject方式是一个大的进步,此方式为根据json字符串数据结构,预先创建对应结构属性的model类,然后gson类库实例化model类为model对象,将json数据映射到model对象的各个对应属性,然后直接使用model对象。但是此种方式的缺点为:如一个联网andriod app,每个json网络请求,都需要创建对应的model类,导致项目会充斥着大量只是为了解析json数据的model类,并且稍微改下json字符串数据结构,model类属性结构又得改;
5.以上问题为所有强类型静态语言的json数据解析的通病,
6.其他强类型语言解析方式的解析技术方案也就是对应上面两种:
7.如:objective

c语言的nsjsonserialization、dar语言的json.decode对应第1种json字符串转化为map、list的技术方案;
8.objective

c语言的jsonmodel、dart语言的json_serializable对应第2种json字符串转model对象的技术方案。


技术实现要素:

9.本发明核心点在于,创造了上述1、2种之外的第3种新型json解析技术方案,使用epath进行获取json数据(可选泛型进行确认类型)。
10.本发明是通过以下技术方案实现的:
11.本发明可以让静态编程语言可以有动态编程语言一样灵活简洁的json字符串解析能力,一行代码解析到想要解析的任何数据。
12.本发明核心点在于,创造了上述1、2种之外的第3种新型json解析技术方案,使用epath进行获取json数据(可选泛型进行确认类型)。
13.举个例子,json字符串如为:{"name":"枫儿","arms":[{"name":"gun"},{"name":"sword"}]},如果想要获取arms数组第二个对象的name的值,以前第1种json字符串转化为map、list的技术方案下,需要数10行代码进行各种判断是否为空和类型进行获取,
第2种json字符串转model对象的技术方案下开发人员也需要建立对应的model类,并且还4、5行进行判断是否为空(可能arms数组为空,或者超出index所以需要判断)进行获取。
[0014]
而本发明下,只需要json.get<string>("arms[1].name")一行代码即可获取到值,极大的提升了代码质量,降低了开发难度,提升了开发速度,降低了心智负担。
[0015]
本发明下,对于无论层级多少深的数据,都能一行进行解析获取,对于app开发甚至可以直接用于view层,如图以dart语言flutter框架为例,widget直接获取数据,省去了网络请求json解析后获取确认数据,view层才能再使用的过程。
[0016]
在创建解析结果对象时,可传入json字符串,也可传入json字符串转化为的map,如具体实施例表1中e1、e2变量创建时所示。
[0017]
epath的规范为:获取字段直接字段名,获取json对象下的字段使用点语法,获取json数组下的值使用方括号包裹下标的方式,使用极其简单易于理解。
[0018]
对于获取时可以选择声明泛型json.get<string>("arms[1].name")以确认泛型,也可以json.get("arms[1].name")自行进行类型判断以及类型转换3。
[0019]
本发明进行更新数据,也只需要json.set("arms[1].name","jack"),通过传入epath、值,一行代码即可更新掉值。
[0020]
本发明要转回json字符串,只需要json.tostring();即可转回json字符串。
[0021]
本发明相比现有技术具有以下优点:
[0022]
本发明下,只需要json.get<string>("arms[1].name")一行代码即可获取到值,极大的提升了代码质量,降低了开发难度,提升了开发速度,降低了心智负担。
附图说明
[0023]
图1为eson数据内部存储结构示意图e1部分;
[0024]
图2为内部实现原理;
[0025]
图3为为eson数据内部存储结构示意图e1、e2、e3部分;
[0026]
图4为get方法的实现;
[0027]
图5为set方法实现;
[0028]
图6为转化回json字符串方法实现。
具体实施方式
[0029]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0030]
实施例1
[0031]
请参阅图1

6,本发明提供一种技术方案:
[0032]
以下结合附图对于本发明的原理和特征进行描述,所举实列只用于解释本发明,并非用于限定本发明的范围。
[0033]
本发明技术方案可以让静态编程语言可以有动态编程语言一样灵活简洁的json字符串解析能力,一行代码解析到想要解析的任何数据。
[0034]
本发明核心点在于,创造了上述1、2种之外的第3种新型json解析技术方案,使用epath进行获取json数据(可选泛型进行确认类型)。
[0035]
举个例子,json字符串如为:{"name":"枫儿","arms":[{"name":"gun"},{"name":"sword"}]},如果想要获取arms数组第二个对象的name的值,以前第1种json字符串转化为map、list的技术方案下,需要数10行代码进行各种判断是否为空和类型进行获取,第2种json字符串转model对象的技术方案下开发人员也需要建立对应的model类,并且还4、5行进行判断是否为空(可能arms数组为空,或者超出index所以需要判断)进行获取如图1。
[0036]
而本技术方案下,只需要json.get<string>("arms[1].name")一行代码即可获取到值,极大的提升了代码质量,降低了开发难度,提升了开发速度,降低了心智负担。
[0037]
本技术方案下,对于无论层级多少深的数据,都能一行进行解析获取,对于app开发甚至可以直接用于view层,如图以dart语言flutter框架为例,widget直接获取数据,省去了网络请求json解析后获取确认数据,view层才能再使用的过程。
[0038]
在创建解析结果对象时,可传入json字符串,也可传入json字符串转化为的map,如图中e1、e2变量创建时所示,如图1

3。
[0039]
epath的规范为:获取字段直接字段名,获取json对象下的字段使用点语法,获取json数组下的值使用方括号包裹下标的方式,使用极其简单易于理解。如图3。
[0040]
对于获取时可以选择声明泛型json.get<string>("arms[1].name")以确认泛型,也可以json.get("arms[1].name")自行进行类型判断以及类型转换如图4。
[0041]
本发明进行更新数据,也只需要json.set("arms[1].name","jack"),通过传入epath、值,一行代码即可更新掉值。如图5。
[0042]
本发明要转回json字符串,只需要json.tostring();即可转回json字符串。如图6。
[0043]
以上技术方案为本发明的核心权利,不限编程语言。
[0044]
本技术方案本人提供了目前流行的google inc.dart语言版本。
[0045]
以下是部分核心代码,主要用于演示编程逻辑:
[0046]
[0047]
[0048][0049]
[0050][0051]
[0052][0053]
内部实现原理为:
[0054]
1,实例化解析结果对象时,传入json字符串或者入json字符串转化为的map,方便灵活使用。
[0055]
2,判断如果是字符串类型,则通过各自变成语言内json字符串转化为map、list的类库,将其转化为map,如果是map则直接使用,赋值给结果对象内成员变量data存储。
[0056]
3,结果对象内部拥有一个索引map,key为epath,值为节点对象(节点对象包含:节
点值、父节点、节点类型),其中结果值只是指向成员变量data。
[0057]
4,通过递归方式,遍历传入的json map整个树的各个节点,递归时计算该节点的epath为key,节点为value(节点值、父节点、节点类型)存储到内部索引map上。
[0058]
5,结果对象中的get方法的实现为,直接将传入的epath作为key获取索引map中的节点,如果获取到取出节点值,使用传入的泛型乐西接收,不为空直接返回,如果为空则再判断有没有传入默认值,如果有就返回默认值,否则返回空。
[0059]
6,结果对象的set方法实现为,将传入的epath创建或者更新掉epath节点的节点值,如果传入的epath是map或者list类型,则删除所有下级节点,再重新递归建立下级索引节点。
[0060]
7,结果对象的转化回json字符串方法实现为,直接使用各自语言中map转字符串方法,将成员变量data转回字符串。
[0061]
相比较现有方案,极大的提升了代码质量,降低了开发难度,提升了开发速度,降低了心智负担。
[0062]
特别对于复杂深层次json,无需判断空、数组长度,直接一行代码获取到值。
[0063]
对于app客户端开发,如flutter,可以直接在view层的widget获取数据,方便程度媲美动态编程语言的json解析:
[0064]
如解析一段json字符串,以java为例:
[0065]
{"name":"枫儿","arms":[{"name":"gun"},{"name":"sword"}]},
[0066]
如果想要获取arms数组第二个对象的name的值,
[0067]
第1种json字符串转化为map、list的技术方案
[0068]
1,需要先将字符串解析成jsonobject,如变量名命名为data
[0069]
2,调用data.get("arms")获取arms的jsonarray
[0070]
3,判断arms是否为空是否类型是否为jsonarray并转化为jsonarray
[0071]
4,判断arms jsonarray的长度是否大于2
[0072]
5,调用arms.get(1)获取jsonarray的第二个元素,如变量名命名为arm2
[0073]
6,判断arm2是否为空是否类型是否为jsonobject并转化为jsonobject
[0074]
7,调用arm2.get("name")获取arm2的name值,如变量名命名为arm2name
[0075]
8,判断arm2name是否为空是否类型是否为string并转化为string
[0076]
第2种json字符串转model对象的技术方案
[0077]
1,需要创建和json格式对应属性的各个model类
[0078]
2,需要先将字符串解析成gson,如变量名命名为data
[0079]
3,调用data.arms获取arms的数组
[0080]
4,判断arms是否为空,数组长度是否大于2
[0081]
5,调用arms[1].name获取arm的对象,并得到name的值
[0082]
使用本技术方案
[0083]
1,需要先将字符串解析成eson,如变量名命名为data
[0084]
2,data.get<string>("arms[1].name")得到name的值
[0085]
dart版本的实现中,使用索引的方式实现了对epath的快速查询,如使用非索引方式直接用算法每次遍历获取数据,也属于本技术方案
[0086]
权利人核心想保护的权利是类似通过json.get<string>("arms[1].name")的epath就能获取到数据的技术方案。
[0087]
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下。由语句“包括一个......限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素”。
[0088]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1