groovy/java自实现json解析器(3)JsonArray
来源:互联网 发布:史丹利的寓言 mac 编辑:程序博客网 时间:2024/06/06 09:21
底层数据结构实现
jsonArray的底层数据结构有列表(list)来维护。它的定义和构造函数初始化工作如下图所示。一般创建对象时默认不传参来构造一个空的列表。
def jsonList //底层数据存储结构 /** * 构造函数,若不传参数,默认初始一个 */def JsonArray( jsonList = null){ this.jsonList = jsonList == null ? [] :jsonList}
公共调用API
下面定义了一些对外提供的API接口工具函数:
/** * 根据索引返回值 * @param index * @return */ def get(index){ return jsonList[index]; } /** * 往数组添加一个值 * @param value * @return */ def add(value){ jsonList << value } /** * 根据健删除内容,返回被删除的内容(如果不存在则返回null) * @param key * @return */ def romove(index){ return jsonList.remove(index) } /** * 判断是否为空 */ def isEmpty(){ return jsonList.isEmpty() } /** * 返回数组的大小 */ def size(){ return jsonList.size() }
核心算法实现
首先,我们定义将将字符串、数组、非Map集合转化为jsonArray对象的核心方法toJsonArray,它首先对object对象的理性判断分成两类,一类是普通json格式字符串,另一类是普通的数组或非map集合数据类型(若为map类型,则直接抛出异常,因为map应有jsonObject对象进行处理。同样类似jsonObject.
1. 关于入参object是字符串类型的,我们给出了两种解法,因为实现思路和我们上一篇讲到的jsonObject类似,因此这里不再分析,也可查看下面代码注释:
final static toJsonArray(object) { JsonArray jsonArray = null if(object.getClass() == String.class){ /** * 方法一:非递归实现json字符串格式转化 */ //先检查是否满足json格式要求// if(!ValidateJson.validate(object)){//不满足要求// return null//返回空// }// String jsonStr = object// if(! jsonStr.startsWith("[") || ! jsonStr.endsWith("]")){// throw new IllegalArgumentException("字符串请以[]开头结尾")// }// //浅层检测双引号合法性//// JsonTool.checkIsDoubleQuoteLegal(jsonStr)// def lrMArray = JsonTool.posBrackerOfString(jsonStr,"[","]")//获取json字符串中所有中括号的位置// def lrBArray = JsonTool.posBrackerOfString(jsonStr,"{","}")//获取json字符串中所有大括号的位置// println "中括号:${lrMArray}"// println "大括号:${lrBArray}"// // //开始根据括号来构建jsonObject// //主要实现原理,根据lrBArray的特定,先存放的括号必定是最里面的,但后面存放的括号不一定包括前一个括号里面的内容// //故这里再次模拟一个栈来一次保存每个括号转换成的jsonObject对象,然后再后续进行序号比较// //若后面括号的起始端序号大于前面括号的起始端信号,说明是包含关系,则在转换后面括号为对象时,通过序号相等将前面括号对象作为后面括号对象的一员,// //注意此时应删除已应用的对象,具体见fromJsonObjectPart函数// jsonArray = JsonTool.getJsonByMergeArray(jsonStr,lrMArray, lrBArray) /** * 方法二:通过递归实现对json格式字符串的转化,同时进行了校验,算法效率较高 */ jsonArray = StringToJson.jsonStringToObjectOrArray(object, false) }else if (object instanceof Map ){ throw new IllegalArgumentException( "放入类型为Map的实现类,请用jsonObject转化") return null }else{//普通数组或map集合类型。直接调用递归函数 jsonArray = recusiveToJsonArray(object) } jsonArray }
- 若object为普通数组或非map集合类型,我们会直接调用递归函数:
/** * 非字符串Object递归处理部分,涵盖数组类型、集合类型或普通对象类型的处理 * @param object * @return */ private final static recusiveToJsonArray(object){ def jsonList = [] if(object.getClass().isArray() || object instanceof Collection ){ for( i in 0..object.size() - 1){ jsonList << JsonObject.recusiveToJsonObject(object[i])//将该对象转换为jsonObject放入 } }else{//对象类型 jsonList << JsonObject.recusiveToJsonObject(object) } new JsonArray(jsonList) }
它的实现思想也是很简单,如果传入object或非map集合类型,则通过递归把里面的数据提取出来。这里有待改善的地方是,如果传入的是一个对象(这个对象还可能是普通数据类型及其包装类),一样会将其解析成容量为1的jsonArray。
下面是将jsonArray转化成普通的array类型,由于原生方法的支持,我们较容易地将其完成转化。
/** * 根据类名转化为list、Set或数组等类型 * @param clazz 为 null表明是数组类型 * @param jsonArray * @return */ final static toArray(Class clazz,JsonArray jsonArray){ if(clazz == null){ return jsonArray.getJsonList().toArray(); } def instance try { instance = clazz.newInstance() } catch (Exception e) { println "不能初始化该类的实例" + e.printStackTrace() } if(instance instanceof Collection){ return jsonArray.getJsonList() }else{ throw new IllegalArgumentException("传入类型不是数组类型或集合类型") return null } }
toString方法重写
下面是toString方法的定义:
/** * 重写tostring方法,用json格式序列化jsonArray对象 */ @Override def String toString() { StringBuffer str = JsonTool.arrayToString(this, new StringBuffer()); return str; }
如果细细观察过jsonArray的各个方法定义,我们会发现,JsonObject和JsonArray是“对称”。它们很多方法的定义和实现思路都是及其相似的,通过对比我们能够更好的理解类中各个方法的实现。
从groovy来实现一个json解析器,可能核心功能就是字符串和jsonObject、jsonArray之间的转化,因为groovy是一门动态语言,因此我们不好通过反射等技巧去判断对象属性的类型,进而实现有效注入。
- groovy/java自实现json解析器(3)JsonArray
- groovy/java自实现json解析器(1)绪论
- groovy/java自实现json解析器(2)JsonObject
- java解析json,并把jsonarray转为list
- JSON复杂文档解析 Android自带JSONObject,JSONArray方法
- Android JSON解析(JSONObject和JSONArray)
- JSON数据解析(JSONArray和JSONObject)
- Android JSON解析(JSONObject和JSONArray)
- JSONObject/JSONArray解析json
- json 解析jsonArray
- Groovy Json生成器和解析器
- Groovy解析json
- java json JSONArray
- Java json处理(org.json.JSONObject/org.json.JSONArray)
- 自实现json解析库
- JSON JSONArray 创建JSON 和 解析JSON
- JSON JSONArray 创建JSON 和 解析JSON
- java实现JSON解析器
- codeforces624B Making a String 贪心 排序
- hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】
- 63. Unique Paths II
- OC基础
- 杭电oj 2018 母牛的故事
- groovy/java自实现json解析器(3)JsonArray
- Sorting Railway Cars----CodeForces 605A
- 深入Java虚拟机读书笔记之高效并发
- Android spannableStringBuilder用法整理
- Andrew Ng 机器学习笔记(六)
- netty在游戏服务器开发中的应用(二)--配置启动服务器
- 平衡二叉树
- 2716: [Violet 3]天使玩偶&&2648: SJY摆棋子|K-DTree
- stl之序列容器——vector