小眼睛的手电筒 · 就用集显行不行?Radeon ...· 1 月前 · |
腼腆的甘蔗 · 第二集: 我,为中美关系而奋斗 (Steph ...· 2 月前 · |
礼貌的火腿肠 · 五大学科竞赛福建24金!这些渠道可升清北等名校· 6 月前 · |
怕老婆的泡面 · 【墨魂】李清照 小阁藏春 ...· 8 月前 · |
读研的酱肘子 · 杭州二中校长尚可:教师心中不能只有高考和成绩· 1 年前 · |
源代码见:https://github.com/Slive/org.slive.simpleJson
基于Json进行数据传输在现在的互联网应用中已经非常非常广泛,所以了解Json数据结构是很有必要的。为了加深理解,自己动手实现一个简单的Json解析器。
实现Json解析器包括两方面:
a、将Java对象转换为Json String
b、将Json String解析为Java对象
简单了解Json数据结构
Json主要由如下两种结构和值组成:
Json Object,即为键值对方式,键只能为字符串类型,值则如常规字符串,数字,日期,对象,hash表,数组,集合等等。由“{”开头,“}”结尾,内由多组键-值组成,键-值中间用“:”隔开,键值与键值之前用“,”隔开,具体如下:
Json Array,由“[”开头,“]”结尾,内由多个值组成,每个值之间用“,”隔开,具体如下:
Json Value,可以是字符串,数字,布尔,或者 嵌套Json Object,Array ,也可能为空,具体如下:
Java对象类型分类
对于Java对象的类型,本文及其后面文章约定了几种类型的定义(可能定义有一定的局限性和不完整):
1、简单类型
a)Java的8种基本类型及其包装类型
b)Java String类型
c)继承Java Number类的类型
2、Collection类型
a)实现Java Collection接口的类型
b)继承Java Collection接口的类型
3、Map类型
a)实现Java Map接口类型
b)继承Java Map接口的类型
4、数组类型
即Java中定义的数组类型
5、复合类型
以上类型除外
代码见TypeUtils.java:
/**
*即boolean、byte、char、short、int、long、float和double
* @see Class.isPrimitive()
*/
publicstaticboolean isPrimitiveType(Class clazz) {
return clazz != null ? clazz.isPrimitive() : false ;
}
publicstaticboolean isPrimitiveWrapperType(Class clazz) {
if (clazz != null ) {
//抽象类Number是BigDecimal、BigInteger、Byte、Double、Float、Integer、Long和Short类的超类
returntrue ;
returntrue ;
}
}
returnfalse ;
}
publicstaticboolean isStringType(Class clazz) {
}
publicstaticboolean isArray(Class clazz) {
return clazz != null ? clazz.isArray() : false ;
}
publicstaticboolean isMap(Class clazz) {
return isContainType(clazz, Map. class );
}
publicstaticboolean isSet(Class clazz) {
return isContainType(clazz, Set. class );
}
publicstaticboolean isList(Class clazz) {
return isContainType(clazz, List. class );
}
publicstaticboolean isCollection(Class clazz) {
return isContainType(clazz, Collection. class );
}
privatestaticboolean isContainType(Class clazz, Class cClazz) {
return cClazz.isAssignableFrom(clazz);
}
/**
*简单类型:原始类型,原始类型的包装类及String类型都归类为
*/
publicstaticboolean isSimpleType(Class clazz) {
return isStringType(clazz)isPrimitiveWrapperType(clazz)isPrimitiveType(clazz);
}
/**
*复合类型:简单类型,集合,数组,Map除外
*/
publicstaticboolean isComplexType(Class clazz) {
return !(isSimpleType(clazz)isMap(clazz)isList(clazz)isSet(clazz)isArray(clazz));
}
将Java对象转换为Json String
Java对象转Json String大体流程如下:
1、对于输入的Java对象实例,首先判断是属于那种类型,然后根据不同类型分别进行处理,处理简单类型,其它都是需要进行嵌套处理,对于Map,集合,数组类型,还需要循环嵌套处理,最终底层来看都是根据 简单类型进行处理 ,然后将处理结果统一到一个StringBuilder中返回。
2、简单类型处理,对应Json Value,直接将简单类型转换为String类型,然后返回。
3、复合类型处理,对应Json Object,这里只能处理pojo类,其它不符合该要求的,将无法解析。通过判断对象实例的getter,setter获取对应的字段名称,也即为key,然后通过getter方法获取值,再对值回到1中嵌套解析处理。
4、Map类型处理,也是对应Json Object,这里的Map中的key对应着Json key,通过循环迭代获取值,再对值回到1中嵌套解析处理。
5、数组/集合类型处理,也是对应Json Array,通过循环迭代获取值,再对值回到1中嵌套解析处理。
6、最后再将结果返回即可。
代码参考Json.java:
*将类转换为json格式字符串
*/
publicstatic StringtoJsonString(Object jsonObj) {
if (jsonObj == null ) {
returnnull ;
}
Class clazz = jsonObj.getClass();
if (TypeUtils.isSimpleType(clazz)) {
return toSimpleString(jsonObj);
} elseif (TypeUtils.isComplexType(clazz)) {
//复合类型对应的值的类型只有可能是Map,否则不解析
return toComplexString(jsonObj);
} elseif (TypeUtils.isMap(clazz)) {
return toMapString((Map) jsonObj);
} elseif (TypeUtils.isArray(clazz)) {
return toArrayString(jsonObj);
} elseif (TypeUtils.isCollection(clazz)) {
return toCollectString((Collection) jsonObj);
}
returnnull ;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券