DTO改造为JsonObject

*爱你&永不变心* 提交于 2020-04-05 17:54:51
曾经有个项目,遇到一个情况就是DTO需要“频繁”的转成JsonObject进行传递(因为用的框架是 Vert.x,用EventBus通信)存在明显的性能消耗。或者使用框架带的DTO自定义,但是一看就没麻烦就没有操作。
需要频繁的操作如下:
JSONObject jo= (JSONObject) JSONObject.toJSON(fooBean);
FooBean fooBean= (FooBean)JSONObject.toBean(jo, FooBean.class);
 
为了提高性能,做的就是改造DTO,思路如下:
本来DTO的属性是本来是以全局变量存在各自的类中,现在把这类全部去掉,改成维护在JsonObject 中。因为操作相同,把所有的DTO都改成继承同一个基础的DTO ,在基础的DTO中统一维护。
1.为了适配其他框架的实例化,还是要保留相应的get/set,但是get/set操作的其实是JsonObject
2.为了非String类型的数据,做相关方法的改写。
 
//-----------BaseJsonDTO .java-----
public class BaseJsonDTO {

    private static Logger logger = LoggerFactory.getLogger(RespGenerator.class);

    private static DateTimeFormatter standDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    private static DateTimeFormatter standDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    @JsonIgnore
    protected JsonObject jsonObject;

    public BaseJsonDTO() {
        jsonObject = new JsonObject();
    }

    public BaseJsonDTO(JsonObject jsonObject) {
        this.jsonObject = jsonObject;
    }

    public JsonObject getJsonObject() {
        return jsonObject;
    }

    public void setJsonObject(JsonObject jsonObject) {
        this.jsonObject = jsonObject;
    }

    /***
     * @Description
     * @Params 日期操作
     * @Returns java.time.LocalDateTime
     */
    public LocalDateTime parseLocalDateTime(String key) {
        return StringUtils.isEmpty(this.jsonObject.getString(key)) ? null : LocalDateTime.parse(this.jsonObject.getString(key), standDateTimeFormatter);
    }

    /***
     * @Description
     * @Params 日期操作2 没有时分秒
     * @Returns java.time.LocalDate
     */
    public LocalDate parseLocalDate(String key) {
        return StringUtils.isEmpty(this.jsonObject.getString(key)) ? null : LocalDate.parse(this.jsonObject.getString(key), standDateFormatter);
    }

    /***
     * @Description
     * @Params 日期操作
     * @Returns java.time.LocalDateTime
     */
    public void putLocalDateTime(String key, LocalDateTime localDateTime) {
        this.jsonObject.put(key, localDateTime == null ? null : localDateTime.format(standDateTimeFormatter));
    }

    /***
     * @Description
     * @Params 日期操作2 没有时分秒
     * @Returns java.time.LocalDate
     */
    public void putLocalDate(String key, LocalDate localDate) {
        this.jsonObject.put(key, localDate == null ? null : localDate.format(standDateFormatter));
    }

    public static <T extends BaseJsonDTO> JsonArray parseList(List<T> list) {
        if (list == null) {
            return null;
        }
        JsonArray jsonArray = new JsonArray();
        for (T t : list) {
            jsonArray.add(t.getJsonObject());
        }
        return jsonArray;
    }

    public static <T extends BaseJsonDTO> List parseJsonArray(JsonArray jsonArray, Class<T> objectClass) {
        if (jsonArray == null) {
            return new ArrayList();
        }
        List<T> result = new ArrayList<>();
        for (Iterator iter = jsonArray.iterator(); iter.hasNext(); ) {
            JsonObject jsonObject = (JsonObject) iter.next();
            T t = null;
            try {
                t = objectClass.newInstance();
            } catch (InstantiationException e) {
                logger.error("", e);
            } catch (IllegalAccessException e) {
                logger.error("", e);
            }
            t.setJsonObject(jsonObject);
            result.add(t);
        }
        return result;
    }


}

 

//-----------CallNumDTO.java-----
 
public class CallNumDTO extends BaseJsonDTO {

    public CallNumDTO() {
        super();
    }

    public CallNumDTO(JsonObject jsonObject) {
        super(jsonObject);
    }

    public static final String _APPID =  "appId";
    public static final String _NUMS=  "nums";
    public static final String _PRODUCTNAME =  "productName";
    public static final String _PRIVACY = "privacy";

    public String getAppId() {
        return this.jsonObject.getString(_APPID);
    }

    public void setAppId(String appId) {
        this.jsonObject.put(_APPID,appId);
    }

    public List<String> getNums() {
        return this.jsonObject.getJsonArray(_NUMS).getList();
    }

    public void setNums(List<String> nums) {
        this.jsonObject.put(_NUMS, new JsonArray(nums));
    }

    public String getProductName() {
        return this.jsonObject.getString(_PRODUCTNAME);
    }

    public void setProductName(String productName) {
        this.jsonObject.put(_PRODUCTNAME,productName);
    }

    public String getPrivacy() {
        return this.jsonObject.getString(_PRIVACY);
    }

    public void setPrivacy(String privacy) {
        this.jsonObject.put(_PRIVACY,privacy);
    }
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!