JSON

服务器端json数据文件分割合并简介

字号+ 作者:H5之家 来源:H5之家 2017-09-03 18:01 我要评论( )

服务器端json数据文件分割合并简介 发布时间: 2017-02-08 16:32:07 作者:拓胜科技 来源:拓胜科技 浏览次数: 次 摘要:服务器端json数据文件分割合并简介,想高薪转行就学习IT吧,学习IT就选择java,因为java工程师的待遇是IT职业最高的,而且java程序语

服务器端json数据文件分割合并简介

发布时间: 2017-02-08 16:32:07   作者:拓胜科技   来源:拓胜科技   浏览次数: 次  

摘要:服务器端json数据文件分割合并简介,想高薪转行就学习IT吧,学习IT就选择java,因为java工程师的待遇是IT职业最高的,而且java程序语言也是最为主流的计算机语言之一。服务器端json数据文件分割合并简介,下面就一起来学习下java知识点吧……

  服务器端json数据文件分割合并简介,想高薪转行就学习IT吧,学习IT就选择java,因为java工程师的待遇是IT职业最高的,而且java程序语言也是最为主流的计算机语言之一。服务器端json数据文件分割合并简介,下面就一起来学习下java知识点吧。

  服务器端json数据文件分割合并简介:

  问题引入

  Json 是什么就不多说了,本文把Json理解成一种协议。

  印象之中,Json貌似是前端的专属,其实不然,服务器端组织数据,依然可以用Json协议。

  比如说,某公司有一套测评题目(基于Json协议),这些题目比较珍贵,不想直接放在js中,所以就将题目文件放在服务器端,然后通过一个接口去请求,多一层控制,就多了一层保护,通过在接口上加权限,可保证数据安全。

  如此一来,服务器端必定会有一个Json文件(纯文本文件),Json文件中包含Json数据。

  假设Json数据结构如下:

  1 {

  2 "name": "题库",

  3 "items": [{

  4 "name": "测评-1",

  5 "items": [/*...*/]

  6 },{

  7 "name": "测评-2",

  8 "items": [/*...*/]

  9 },{

  10 "name": "测评-3",

  11 "items": [/*...*/]

  12 }/*...*/]

  13 }

  暂不讨论这样设计的合理性,假定已经是这么设计了,无法再做更改。但凡是有些规模的项目,需求变动都比较频繁,项目工期也比较紧张,不得不做出妥协,完美的设计是不存在的。

  随着时间和规模的增长,测评会越来越多,而且每个测评本身包含的数据也不少,这样一来,这个Json文件会越来越大。

  众所周知,IO操作是一个巨大的瓶颈,如果Json文件太大,占用IO过多,将导致性能严重下降。同时Json文件太大,也不好管理,不符合开闭原则。

  因此,我们迫切需要对Json文件进行拆分,把数据量大、独立性强、自成一体的Json数据转移到主体的外部,单独放在一个Json文件中,这样不仅缩小了单个文件的体积,也方便管理。

  其实这样做最大的优点是可以实现懒加载,或者说是按需加载。

  这样的情景很常见,比如在进行数据检索时,一般情况下,会先看到一个数据概要列表,列出几项重要信息,其他次要信息需要点击“详情”按钮时,才去加载。

  拿上边测评的例子来说,第一步仅需显示出有哪些测评,然后根据用户的选择,再去加载对应测评的详细信息。没有必要一上来就把所有的信息都返回给客户端,不仅浪费资源,还降低了数据安全性。

  如何才能实现Json文件的合并呢?请看下章~~~

  解决方案:Jean

  Jean是一个Java工具类,她可以实现Json文件合并、依赖管理,灵感来自于前端模块化开发。

  这名字是怎么来的呢?前端模块化开发,国内比较厉害的就是Sea.js了,小菜要写的是Java工具类,要不就叫Jea?于是赶紧上网查查Jea有没有啥特殊含义,万一是敏感词就不好了。结果一查,查到了Jean,可翻译为“珍”,相当不错的名字嘛,就是她了!

  Jean的思想是在Json文件中,加入一段特殊代码,来引入其他Json文件,有点像Jsp中的include。语法为:@Jean("family","./items/family.js")。可以把@Jean()理解成函数调用,里边有两个参数,第一个参数是属性名称,第二个参数是依赖文件的相对路径。

  文章开篇测评的例子,可以写成这样:

  1 {

  2 "name": "题库",

  3 "items": [{

  4 "name": "测评-1",

  5 @Jean("items","./items1/test.js")

  6 },{

  7 "name": "测评-2",

  8 @Jean("items","./items2/test.js")

  9 },{

  10 @Jean("items","./items3/test.js"),

  11 "name": "测评-3"

  12 }/*...*/]

  13 }

  假设./items1/test.js中内容为:

  1 {

  2 name: "测评-1-内容"

  3 }

  由此可以看出,@Jean在Json文件中的写法,就和普通的属性写法一样,如果是写在最后边,末尾就不用加逗号,其他情况同样需要加逗号。

  通过工具类解析之后,@Jean("items","./items1/test.js")会变成:"items": {name: "测评-1-内容"},替换之后,为了保证格式正确,所以写@Jean的时候需要按照正常的语法加逗号。

  第一个参数,将会转换成@Jean占位符被替换后的Json属性名称,如果不写,默认为"jean"。

  第二个参数是该属性依赖的Json文件的相对路径,当然是相对于当前Json文件的,Jean会根据当前Json文件的路径,找到依赖的Json文件,然后读取内容,再合并到当前Json文件中。目前小菜实现的Jean工具类,只能识别./和../两种相对路径语法(含义与HTML相对路径语法相同)。

  所以,@Jean仅仅是一个占位符,包含有@Jean的Json字符串,必须经过Jean工具类处理之后,才是合法的Json字符串。同时,Jean仅仅关心依赖,而不关心依赖的组织形式,这样可以带来巨大的灵活性,无论怎样组织文件结构,最终体现到Jean的仅仅是一个相对路径而已。

  Jean工具类提供了三个public方法:

  1 /**

  2 * 解析所有的jean表达式

  3 * @param json json字符串

  4 * @param jsonPath json字符串所在路径,完整路径

  5 * @return 解析后的json字符串

  6 */

  7 public static String parseAll(String json,String jsonPath){}

  8

  9 /**

  10 * 解析单个jean表达式

  11 * @param express jean表达式

  12 * @param jsonPath json字符串所在路径,完整路径

  13 * @return 解析结果

  14 */

  15 public static String parseOne(String express,String jsonPath){}

  16

  17 /**

  18 * 解析特定的jean表达式

  19 * @param json json字符串

  20 * @param jsonPath json字符串所在路径,完整路径

  21 * @param names 需要解析的属性名称列表

  22 * @return 解析后的json字符串

  23 */

  24 public static String parseTarget(String json,String jsonPath,List names){}

  第一个方法就是说给我一个包含@Jean的Json字符串,再给我这个Json字符串所在文件的绝对路径,我就把所有的@Jean解析成依赖文件中的内容。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • java将数据转成json编码格式技术实例教程

    java将数据转成json编码格式技术实例教程

    2017-09-03 16:01

  • Core Json–JSON和Java

    Core Json–JSON和Java

    2017-09-03 16:00

  • PHP实现json_encode函数不转义中文的多种方法

    PHP实现json_encode函数不转义中文的多种方法

    2017-09-02 16:03

  • C#对象转Json序列化

    C#对象转Json序列化

    2017-09-02 12:00

网友点评
c