底层数据结构实现
本对象的底层数据结构是一个Map(映射),我们用def private jsonMap
将其定义为对象变量。我们在构造函数中对其进行初始化,它以键值对的形式存储数据,其中键必须为字符串,值可以为字符串、Boolean、Integer、JsonArray、JsonObject,从最后两个可存储对象,我们或多或少地已能看出JsonObject是如何达成普通json对象里的无限嵌套了。
下面是本对象的构造函数。
def JsonObject( jsonMap = null) {
this.jsonMap = jsonMap == null ? [:] : jsonMa//初始化jsonMap
}
在调用构造函数时,如果我们不传入jsonMap,则会使用默认参数null,这时,我们就以[:]对map进行初始化。
公共调用API
下面定义了一些对外提供的API接口工具函数:
/**
* 根据键获取内容
* @param key
* @return
*/
def get(key){
return jsonMap.get(key)
}
/**
* 以key为键,将value存入map中
* @param key
* @param value
* @return
*/
def put(key,value){
jsonMap.put(key, value)
}
/**
* 根据健删除内容,返回被删除的内容(如果不存在则返回null)
* @param key
* @return
*/
def romove(key){
return jsonMap.remove(key)
}
/**
* 返回键集
* @return
*/
def keySet(){
return jsonMap.keySet()
}
/**
* 返回键值对集
* @return
*/
def entrySet(){
return jsonMap.entrySet()
}
/**
* 判断是否为空
*/
def isEmpty(){
return jsonMap.isEmpty()
}
/**
* 返回对象的大小
*/
def size(){
return jsonMap.size()
}
如果使用过类似于net.json等库函数操作json字符串的,就会对上述的方法非常熟悉了。
核心算法实现
在核心实现中,首先定义了toJsonObject(object)方法,它能将普通json字符串、集合或数组和普通数据类型转化为我们的jsonObject对象,它的定义形如:
/**
* 将object内容转换成JsonObject ,
* object 必须是普通json字符串、集合或数组和普通数据类型
* @param object
* @return
*/
final static JsonObject toJsonObject(object) {
JsonObject jsonObject = null
println object
if (object.getClass() == String.class) {
// 如果是普通字符串,则格式化字符串格式输入
some codes...
}else{
//条件判断是对象类型还是非字符串普通数据类型还是数组或集合类型,遍历对象属性添加
the other codes...
}// end of 对象类型外循环
jsonObject //返回值
}
首先我们把object是否为字符串拿出来单独判断,如果
object.getClass() == String.class
,object必须以”{“开头,且以”}“结尾。这种情况我们单独解析,而关于如何把json格式字符串解析成我们的JsonObject,这里使用了两种方法:- 第一种方法的思路是参考了逆波兰算法的模式括号匹配。
/**
- 第一种方法的思路是参考了逆波兰算法的模式括号匹配。