本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
底层数据结构实现
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格式字符串的转化,同时进行了校验,算法效率较高
jsonArray = StringToJson.jsonStringToObjectOrArray(object, false)
}else if (object instanceof Map ){
throw new IllegalArgumentException( "放入类型为Map的实现类,请用jsonObject转化")
return null
}else{
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])
}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是一门动态语言,因此我们不好通过反射等技巧去判断对象属性的类型,进而实现有效注入。