精益编程框架

开发文档
点击登录,精彩内容等着你

JSONObject增强

系列文档

关联类名: JSONObject.java

Fastjson2对JSONObject类,其实已经提供了相当多的方法,但是在使用过程中,往往有些业务情景,默认提供的方法有点不够,所以产生了扩展的想法,作为[全栈侠客],说干就干…

一、究竟哪些情形,让我需要扩展JSONObject

为了让你对JSONObject有更多的了解,并先阅读:Fastjson1与Fastjson2的差别,深入简化的分析

由于JSONObject作为精益编程的重要传输数据载体,从而产生了一些由于传输而出现的问题,需要解决:

  1. JSONOjbect中经常会用到读取json的属性,这个属性对象为:JSONObject或者JSONArray
  2. 针对读取属性的默认值问题,虽然有提供getOrDefault()的方法,但是需要特别转换才能使用.
  3. JSONObject添加数据的时候,缺少一定的判断或者是数据格式的问题
  4. 作为传输对象,有时候需要对特定的值做一定的处理,特别针对本系统经常使用的扩展属性props的操作
  5. 数据脱敏的操作,或者减少传输数据的数据量方面,这个是当直接返回实体javabean,做不到的,如黑白名单
    …..

基于种种原因,加快平时的开发效率与降低错误,有必要对JSONObject加入一定的业务方法扩展。


扩展方式(包括JSONArray的扩展方式):
得益于包优先级

项目中,建立跟Fastjson2一样的包路径,从JSONObject源码copy一份过来,在类底部添加额外的扩展方法。

二、主要扩展点

1. 批量数据插入

  1. //4.1.批量插入
  2. public JSONObject eles(Object... keyValues) {
  3. if (keyValues.length <= 1 || keyValues.length % 2 != 0) {
  4. System.out.println("err:keyValues length must >=2");
  5. return this;
  6. }
  7. for (int i = 0; i < keyValues.length / 2; i++) {
  8. String key = keyValues[i * 2].toString();
  9. Object value = keyValues[i * 2 + 1];
  10. this.ele(key, value);
  11. }
  12. return this;
  13. }

2. 带判断数据插入

  1. //4.2.根据一定valid,判断是否add
  2. public JSONObject eleCheck(boolean valid, Object... keyValues) {
  3. if(valid){
  4. return this.eles(keyValues);
  5. }
  6. return this;
  7. }

3.对Date的额外处理

  1. //4.4.日期Date的处理,这里不使用hutool,为了减少依赖
  2. public JSONObject eleDate(String key,Date date) {
  3. if(date != null) {
  4. SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  5. this.ele(key, dateformat.format(date));
  6. }
  7. return this;
  8. }

4.数据脱敏处理,添加黑白名单

JSONObject作为请求响应数据载体,有些敏感数据需要脱敏,或者无用的数据需要去掉,从而减少传输数据量,这里就会使用到对json数据的过滤操作,而且这个过滤需要支持深度过滤,毕竟JSONObject是有无数层数据的,例如:
{id:1,name:'张三',pwd:'123456',childs[{id:2,name:'张三儿子',pwd:445566}]}
以上json数据中,pwd作为敏感数据,是不能直接传输到客户端的,需要对pwd进行过滤去掉处理,那么可以使用:

  1. //5.白名单过滤
  2. public JSONObject white(String... keys) {
  3. if(keys.length > 0) {
  4. JSONFilter.jsonFilter(this, JSONFilter.White(keys));
  5. }
  6. return this;
  7. }
  8. //6.黑名单过滤
  9. public JSONObject black(String... keys) {
  10. if(keys.length > 0) {
  11. JSONFilter.jsonFilter(this, JSONFilter.Black(keys));
  12. }
  13. return this;
  14. }

JSONFilter中的过滤方法,支持递归方式,对数据进行黑白名单处理,详情请参考该类。

5.对特定属性,进行序列化处理

针对本系统习惯使用扩展字段props来进行保存一些非重要的属性,props往往在数据库中,使用varchar字符串进行保存,那么提取的时候,往往这个属性就是一个字符串,但是props业务上,确实一个json。那么输出的时候,就有需求,对props进行string->JSONObject的序列化的需求。

  1. //7.对json中指定的key对应的value进行json化
  2. public void valueToJson(String... keys) {
  3. //详情请参考本类扩展方法
  4. }

6.其他一些有趣扩展

对于一些其他的扩展方法,这里就不一一列出,有兴趣的小伙伴们,进行查看源码。