后期子类继承该基础类即可。

package com.lichmama.test;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class BaseEntity implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = -5311594725961174392L;

    /**
     * modifier for "private static final"
     */
    private static final int privateStaticFinal = 26;

    @Override
    public String toString() {
        try {
            return toJSON();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String toJSON() throws IllegalArgumentException, IllegalAccessException {
        StringBuilder jsonBuff = new StringBuilder();
        jsonBuff.append("{");
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field item : fields) {
            if (item.getModifiers() == privateStaticFinal) {
                continue;
            }
            item.setAccessible(true);
            String name = item.getName();
            jsonBuff.append("\"" + name + "\"" + ":");
            Object value = item.get(this);
            if (value != null) {
                Class<?> type = item.getType();
                if (type == String.class) {
                    jsonBuff.append(value);
                } else if (type == int.class || type == Integer.class) {
                    jsonBuff.append(value);
                } else if (type == short.class || type == Short.class) {
                    jsonBuff.append(value);
                } else if (type == long.class || type == Long.class) {
                    jsonBuff.append(value);
                } else if (type == float.class || type == Float.class) {
                    jsonBuff.append(value);
                } else if (type == double.class || type == Double.class) {
                    jsonBuff.append(value);
                } else if (type == char.class || type == Character.class) {
                    jsonBuff.append("\"" + value + "\"");
                } else if (type == boolean.class || type == Boolean.class) {
                    jsonBuff.append(value);
                } else if (type == Map.class) {
                    jsonBuff.append(mapToString((Map)value));
                } else if (type == List.class) {
                    jsonBuff.append(listToString((List)value));
                } else if (type.getSuperclass() == BaseEntity.class) {
                    jsonBuff.append(((BaseEntity)value).toJSON());
                }
            }
            jsonBuff.append(",");
        }
        return rtrim(jsonBuff, ",") + "}";
    }

    public String mapToString(Map<String, ? extends Object> map) {
        StringBuilder buff = new StringBuilder();
        Iterator<String> iter = map.keySet().iterator();
        buff.append("{");
        while (iter.hasNext()) {
            String name = iter.next();
            Object value = map.get(name);
            buff.append("\"" + name + "\"" + ":");
            if (value != null) {
                String valueStr = String.valueOf(value);
                if (value.getClass() == String.class) {
                    buff.append("\"" + valueStr + "\"");
                } else {
                    buff.append(valueStr);
                }
            }
            buff.append(",");
        }
        return rtrim(buff, ",") + "}";
    }

    public String listToString(List<? extends Object> list) {
        StringBuilder buff = new StringBuilder();
        buff.append("[");
        for (Object value : list) {
            String valueStr = String.valueOf(value);
            if (value.getClass() == String.class) {
                buff.append("\"" + valueStr + "\"");
            } else {
                buff.append(valueStr);
            }
            buff.append(",");
        }
        return rtrim(buff, ",") + "]";
    }

    public String rtrim(StringBuilder buff, String suffix) {
        String content = buff.toString();
        if (content.endsWith(suffix)) {
            content = content.substring(0, content.length() - suffix.length());
        }
        return content;
    }

}

测试下:

class User extends BaseEntity {

    private String username;

    private String password;

        // 此处省略掉getter/setter方法
}

class Department extends BaseEntity {

    private int id;

    private User chief;

    private String deptName;

        // 此处省略掉getter/setter方法
}

public class TestCase {

    public static void main(String[] args) {
        User chief = new User();
        chief.setUsername("lichmama");
        chief.setPassword("12345678");

        Department dept = new Department();
        dept.setChief(chief);
        dept.setId(101);
        dept.setDeptName("R&D");

        System.out.println(dept.toString());
    }
}
{
    "id": 101,
    "chief": {
        "username": "lichmama",
        "password": "12345678"
    },
    "deptName": "R&D"
}

that's it.

为实体类增加toJSON方法的更多相关文章

  1. hql语句查询实体类采用list方法的返回结果集

    在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类", ...

  2. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-010-Introduction为类增加新方法@DeclareParents、<aop:declare-parents>

    一. 1.Introduction的作用是给类动态的增加方法 When Spring discovers a bean annotated with @Aspect , it will automat ...

  3. Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)返回非映射实体类的解决方法

    Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用 一直用ORM,今天用JdbcTemplate ...

  4. 【技术】JavaSE环境下JPA实体类自动注册

    在没有容器支持的环境下,JPA的实体类(Entity)一般要在persistence.xml中逐个注册,类似下面这样: <?xml version="1.0" encodin ...

  5. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  6. 实体类(VO,DO,DTO,PO)的划分《转载---》

    转载自:https://blog.csdn.net/u010722643/article/details/61201899 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实 ...

  7. java 项目中几种O实体类的概念

    经常会接触到vo,do,dto的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,vo对应于页面上需要显示的数据(表单),do对应 ...

  8. [转]实体类(VO,DO,DTO)的划分

    原文地址:http://blog.sina.com.cn/s/blog_7a4cdec80100wkyh.html 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情 ...

  9. 领域模型中的实体类分为四种类型:VO、DTO、DO、PO

    http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...

随机推荐

  1. 同步文件的利器-rsync

    即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我不想失去任何这些数据. rsync是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件 ...

  2. 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径

    4.4.1  使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...

  3. 开关调色新世界BP2888电源解决方案

    LED智能方案经过几年的拼杀,已经风靡照明界.但人们渐渐发现,对照明来说,一味追求花哨的功能并不被市场所认同,而其中开关调色,以其简单易操作的特点,已逐步融入广大消费者的生活习惯中.对吸顶灯,面板灯等 ...

  4. R语言快速深度学习进行回归预测(转)

    深度学习在过去几年,由于卷积神经网络的特征提取能力让这个算法又火了一下,其实在很多年以前早就有所出现,但是由于深度学习的计算复杂度问题,一直没有被广泛应用. 一般的,卷积层的计算形式为: 其中.x分别 ...

  5. net.sf.json.JSONException: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException at java.sql.Date.getHours(Unknown Source)

    数据库字段类型为Date,转成JSON格式会有问题,解决方案如下: json-lib有一个配置类JsonConfig通过JsonConfig可以注册一个字段处理器实现JsonValueProcesso ...

  6. 虚拟机安装Android最详细教程

    虚拟机想必大家都听说过,有些同学还用过.虚拟机可以模拟出一个操作系统,基于物理机创建.可以模拟常见的 Windows,ubuntu等等. 在使用虚拟机的过程中,想必大家都遇到过一些棘手的问题,尤其是安 ...

  7. Html5语义化标签详解及其兼容性处理

    <header></header> 页眉 主要用于页面的头部的信息介绍,也可用于板块头部 <hgroup></hgroup> 页面上的一个标题组合 一个 ...

  8. General Thread States

    对于实践中可能出现的各种General Thread States 以下列表描述了与常规查询处理关联的线程状态值,而不是更复杂的活动,例如复制. 其中许多仅用于在服务器中查找错误. after cre ...

  9. Ch2. Loop Structure

    Ex Input some integers and output their min, max and average values (keep three decimal places). It ...

  10. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...