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

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. Java 8 Learn Notes

    Main reference: [1] http://winterbe.com/posts/2014/03/16/java-8-tutorial/ [2] https://plus.google.co ...

  2. bash shell中测试命令

    bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径.如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 .这样if-than语句就与其他编程 ...

  3. swift闭包中解决循环引用的问题

    swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...

  4. spring-线程池(2)

    继承:http://www.cnblogs.com/crazylqy/p/4220743.html spring设置容器启动时运行线程类(可循环执行) 修改以下两文件, 1.spring设置容器启动时 ...

  5. RGB565的理解

    一个彩色图像由R G B三个分量组成,一个RGB565的每一个像素点数据为2Byte,即16位,那么从名字上就可看出来这16位中,高5位为R分量,中间6位为G分量,低5位为B分量. 下面做了一个实验, ...

  6. Linux下批量管理工具PSSH

    pssh命令 pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认 ...

  7. DDD领域驱动之干货(三)完结篇!

    首先这里发一下结构图,因为是重写的,但是代码都是一样所有如下: 这里我先说一下看了大部分的DDD文章都是采用的WCF做服务,这里呢我用的是webapi做服务,WCF和WEBAPI的区别可以去百度下. ...

  8. js—浅谈方法和思路的重要性(首篇求大佬支持)

    js-浅谈方法和思路的重要性 学了这么久的js,我从老师的,同学的代码中发现,老师写的代码比我们的要清楚的很多,基本上没有太多累赘啊,能少的没有少啊等等..... 废话不多说,下面我们来看看这个我的一 ...

  9. python爬虫从入门到放弃(七)之 PyQuery库的使用

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  10. 【JAVAWEB学习笔记】网上商城实战5:后台的功能模块

    今日任务 完成后台的功能模块 1.1      网上商城的后台功能的实现: 1.1.1    后台的功能的需求: 1.1.1.1  分类管理: [查询所有分类] * 在左侧菜单页面中点击分类管理: * ...