Fastjson2对JSONObject类,其实已经提供了相当多的方法,但是在使用过程中,往往有些业务情景,默认提供的方法有点不够,所以产生了扩展的想法,作为[全栈侠客],说干就干…
一、究竟哪些情形,让我需要扩展JSONObject
为了让你对JSONObject有更多的了解,并先阅读:Fastjson1与Fastjson2的差别,深入简化的分析
由于JSONObject作为精益编程的重要传输数据载体,从而产生了一些由于传输而出现的问题,需要解决:
- JSONOjbect中经常会用到读取json的属性,这个属性对象为:JSONObject或者JSONArray
- 针对读取属性的默认值问题,虽然有提供
getOrDefault()
的方法,但是需要特别转换才能使用. - JSONObject添加数据的时候,缺少一定的判断或者是数据格式的问题
- 作为传输对象,有时候需要对特定的值做一定的处理,特别针对本系统经常使用的
扩展属性props
的操作 - 数据脱敏的操作,或者减少传输数据的数据量方面,这个是当直接返回实体javabean,做不到的,如黑白名单
…..
基于种种原因,加快平时的开发效率与降低错误,有必要对JSONObject加入一定的业务方法扩展。
扩展方式(包括JSONArray的扩展方式):
得益于包优先级
项目中,建立跟Fastjson2一样的包路径,从JSONObject源码copy一份过来,在类底部添加额外的扩展方法。
二、主要扩展点
1. 批量数据插入
//4.1.批量插入
public JSONObject eles(Object... keyValues) {
if (keyValues.length <= 1 || keyValues.length % 2 != 0) {
System.out.println("err:keyValues length must >=2");
return this;
}
for (int i = 0; i < keyValues.length / 2; i++) {
String key = keyValues[i * 2].toString();
Object value = keyValues[i * 2 + 1];
this.ele(key, value);
}
return this;
}
2. 带判断数据插入
//4.2.根据一定valid,判断是否add
public JSONObject eleCheck(boolean valid, Object... keyValues) {
if(valid){
return this.eles(keyValues);
}
return this;
}
3.对Date的额外处理
//4.4.日期Date的处理,这里不使用hutool,为了减少依赖
public JSONObject eleDate(String key,Date date) {
if(date != null) {
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
this.ele(key, dateformat.format(date));
}
return this;
}
4.数据脱敏处理,添加黑白名单
JSONObject作为请求响应数据载体,有些敏感数据需要脱敏,或者无用的数据需要去掉,从而减少传输数据量,这里就会使用到对json数据的过滤操作,而且这个过滤需要支持深度过滤,毕竟JSONObject是有无数层数据的,例如:{id:1,name:'张三',pwd:'123456',childs[{id:2,name:'张三儿子',pwd:445566}]}
以上json数据中,pwd作为敏感数据,是不能直接传输到客户端的,需要对pwd进行过滤去掉处理,那么可以使用:
//5.白名单过滤
public JSONObject white(String... keys) {
if(keys.length > 0) {
JSONFilter.jsonFilter(this, JSONFilter.White(keys));
}
return this;
}
//6.黑名单过滤
public JSONObject black(String... keys) {
if(keys.length > 0) {
JSONFilter.jsonFilter(this, JSONFilter.Black(keys));
}
return this;
}
JSONFilter中的过滤方法,支持递归方式,对数据进行黑白名单处理,详情请参考该类。
5.对特定属性,进行序列化处理
针对本系统习惯使用扩展字段props来进行保存一些非重要的属性,props往往在数据库中,使用varchar字符串进行保存,那么提取的时候,往往这个属性就是一个字符串,但是props业务上,确实一个json。那么输出的时候,就有需求,对props进行string->JSONObject的序列化的需求。
//7.对json中指定的key对应的value进行json化
public void valueToJson(String... keys) {
//详情请参考本类扩展方法
}
6.其他一些有趣扩展
对于一些其他的扩展方法,这里就不一一列出,有兴趣的小伙伴们,进行查看源码。