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

  1. package com.lichmama.test;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.reflect.Field;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. public class BaseEntity implements Serializable {
  10.  
  11. /**
  12. *
  13. */
  14. private static final long serialVersionUID = -5311594725961174392L;
  15.  
  16. /**
  17. * modifier for "private static final"
  18. */
  19. private static final int privateStaticFinal = 26;
  20.  
  21. @Override
  22. public String toString() {
  23. try {
  24. return toJSON();
  25. } catch (IllegalArgumentException e) {
  26. e.printStackTrace();
  27. } catch (IllegalAccessException e) {
  28. e.printStackTrace();
  29. }
  30. return null;
  31. }
  32.  
  33. public String toJSON() throws IllegalArgumentException, IllegalAccessException {
  34. StringBuilder jsonBuff = new StringBuilder();
  35. jsonBuff.append("{");
  36. Field[] fields = this.getClass().getDeclaredFields();
  37. for (Field item : fields) {
  38. if (item.getModifiers() == privateStaticFinal) {
  39. continue;
  40. }
  41. item.setAccessible(true);
  42. String name = item.getName();
  43. jsonBuff.append("\"" + name + "\"" + ":");
  44. Object value = item.get(this);
  45. if (value != null) {
  46. Class<?> type = item.getType();
  47. if (type == String.class) {
  48. jsonBuff.append(value);
  49. } else if (type == int.class || type == Integer.class) {
  50. jsonBuff.append(value);
  51. } else if (type == short.class || type == Short.class) {
  52. jsonBuff.append(value);
  53. } else if (type == long.class || type == Long.class) {
  54. jsonBuff.append(value);
  55. } else if (type == float.class || type == Float.class) {
  56. jsonBuff.append(value);
  57. } else if (type == double.class || type == Double.class) {
  58. jsonBuff.append(value);
  59. } else if (type == char.class || type == Character.class) {
  60. jsonBuff.append("\"" + value + "\"");
  61. } else if (type == boolean.class || type == Boolean.class) {
  62. jsonBuff.append(value);
  63. } else if (type == Map.class) {
  64. jsonBuff.append(mapToString((Map)value));
  65. } else if (type == List.class) {
  66. jsonBuff.append(listToString((List)value));
  67. } else if (type.getSuperclass() == BaseEntity.class) {
  68. jsonBuff.append(((BaseEntity)value).toJSON());
  69. }
  70. }
  71. jsonBuff.append(",");
  72. }
  73. return rtrim(jsonBuff, ",") + "}";
  74. }
  75.  
  76. public String mapToString(Map<String, ? extends Object> map) {
  77. StringBuilder buff = new StringBuilder();
  78. Iterator<String> iter = map.keySet().iterator();
  79. buff.append("{");
  80. while (iter.hasNext()) {
  81. String name = iter.next();
  82. Object value = map.get(name);
  83. buff.append("\"" + name + "\"" + ":");
  84. if (value != null) {
  85. String valueStr = String.valueOf(value);
  86. if (value.getClass() == String.class) {
  87. buff.append("\"" + valueStr + "\"");
  88. } else {
  89. buff.append(valueStr);
  90. }
  91. }
  92. buff.append(",");
  93. }
  94. return rtrim(buff, ",") + "}";
  95. }
  96.  
  97. public String listToString(List<? extends Object> list) {
  98. StringBuilder buff = new StringBuilder();
  99. buff.append("[");
  100. for (Object value : list) {
  101. String valueStr = String.valueOf(value);
  102. if (value.getClass() == String.class) {
  103. buff.append("\"" + valueStr + "\"");
  104. } else {
  105. buff.append(valueStr);
  106. }
  107. buff.append(",");
  108. }
  109. return rtrim(buff, ",") + "]";
  110. }
  111.  
  112. public String rtrim(StringBuilder buff, String suffix) {
  113. String content = buff.toString();
  114. if (content.endsWith(suffix)) {
  115. content = content.substring(0, content.length() - suffix.length());
  116. }
  117. return content;
  118. }
  119.  
  120. }

测试下:

  1. class User extends BaseEntity {
  2.  
  3. private String username;
  4.  
  5. private String password;
  6.  
  7. // 此处省略掉getter/setter方法
  8. }
  9.  
  10. class Department extends BaseEntity {
  11.  
  12. private int id;
  13.  
  14. private User chief;
  15.  
  16. private String deptName;
  17.  
  18. // 此处省略掉getter/setter方法
  19. }
  20.  
  21. public class TestCase {
  22.  
  23. public static void main(String[] args) {
  24. User chief = new User();
  25. chief.setUsername("lichmama");
  26. chief.setPassword("12345678");
  27.  
  28. Department dept = new Department();
  29. dept.setChief(chief);
  30. dept.setId(101);
  31. dept.setDeptName("R&D");
  32.  
  33. System.out.println(dept.toString());
  34. }
  35. }
  1. {
  2. "id": 101,
  3. "chief": {
  4. "username": "lichmama",
  5. "password": "12345678"
  6. },
  7. "deptName": "R&D"
  8. }

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. Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍

    Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...

  2. PropertyGrid自定义控件

    PropertyGrid是一个很强大的控件,使用该控件做属性设置面板的一个好处就是你只需要专注于代码而无需关注UI的呈现,PropertyGrid会默认根据变量类型选择合适的控件显示.但是这也带来了一 ...

  3. JVM类加载以及执行的实战

    前几篇文章主要是去理解JVM类加载的原理和应用,这一回讲一个可以自己动手的例子,希望能从头到尾的理解类加载以及执行的整个过程. 这个例子是从周志明的著作<深入理解Java虚拟机>第9章里抄 ...

  4. 【PHP】最详细PHP从入门到精通(二)——PHP中的函数

     PHP从入门到精通 之PHP中的函数 各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持.PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新 ...

  5. TreeSet集合排序方式二:定制排序Comparator

    Comparator有两种实现方式: 1,匿名内部类 2,创建一个类用于实现Comparator,该类创建的对象就是比较器 Person类 public class Person implements ...

  6. 移动应用/APP的测试流程及方法

    1. APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先 ...

  7. python 读取Excel(二)之xlwt

    今天由于在接口测试报告中感觉自己写的接口测试报告特别low,Excel的连个颜色都不加,就想着怎么去想办法给整整,自己根据API一次次调试,感觉很慢,于是乎,百度,可惜没有找到,去官网,官网给的也特别 ...

  8. openresty使用笔记(一)

    背景介绍 游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构.使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案.先看看下面这张简单的架构图吧~ 从图上看, ...

  9. 在WIN SERVER 2016上安装DOCKER(带过坑)

    目录 1    概要    1 1.1    主要优势    1 2    在Windows Server上部署Docker    2 概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解 ...

  10. [0] TFS 分支/标签

    比较常见的版本控制分支策略有三种:不稳定主干策略.稳定主干策略.敏捷发布策略. 下面是对这几种策略的摘录: 不稳定主干策略 使用用主干作为新功能开发主线,分支用作发布. 被广泛的应用于开源项目. 比较 ...