为实体类增加toJSON方法
后期子类继承该基础类即可。
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方法的更多相关文章
- hql语句查询实体类采用list方法的返回结果集
在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类", ...
- 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 ...
- Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)返回非映射实体类的解决方法
Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用 一直用ORM,今天用JdbcTemplate ...
- 【技术】JavaSE环境下JPA实体类自动注册
在没有容器支持的环境下,JPA的实体类(Entity)一般要在persistence.xml中逐个注册,类似下面这样: <?xml version="1.0" encodin ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- 实体类(VO,DO,DTO,PO)的划分《转载---》
转载自:https://blog.csdn.net/u010722643/article/details/61201899 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实 ...
- java 项目中几种O实体类的概念
经常会接触到vo,do,dto的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,vo对应于页面上需要显示的数据(表单),do对应 ...
- [转]实体类(VO,DO,DTO)的划分
原文地址:http://blog.sina.com.cn/s/blog_7a4cdec80100wkyh.html 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情 ...
- 领域模型中的实体类分为四种类型:VO、DTO、DO、PO
http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...
随机推荐
- 同步文件的利器-rsync
即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我不想失去任何这些数据. rsync是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件 ...
- 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径
4.4.1 使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...
- 开关调色新世界BP2888电源解决方案
LED智能方案经过几年的拼杀,已经风靡照明界.但人们渐渐发现,对照明来说,一味追求花哨的功能并不被市场所认同,而其中开关调色,以其简单易操作的特点,已逐步融入广大消费者的生活习惯中.对吸顶灯,面板灯等 ...
- R语言快速深度学习进行回归预测(转)
深度学习在过去几年,由于卷积神经网络的特征提取能力让这个算法又火了一下,其实在很多年以前早就有所出现,但是由于深度学习的计算复杂度问题,一直没有被广泛应用. 一般的,卷积层的计算形式为: 其中.x分别 ...
- 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 ...
- 虚拟机安装Android最详细教程
虚拟机想必大家都听说过,有些同学还用过.虚拟机可以模拟出一个操作系统,基于物理机创建.可以模拟常见的 Windows,ubuntu等等. 在使用虚拟机的过程中,想必大家都遇到过一些棘手的问题,尤其是安 ...
- Html5语义化标签详解及其兼容性处理
<header></header> 页眉 主要用于页面的头部的信息介绍,也可用于板块头部 <hgroup></hgroup> 页面上的一个标题组合 一个 ...
- General Thread States
对于实践中可能出现的各种General Thread States 以下列表描述了与常规查询处理关联的线程状态值,而不是更复杂的活动,例如复制. 其中许多仅用于在服务器中查找错误. after cre ...
- Ch2. Loop Structure
Ex Input some integers and output their min, max and average values (keep three decimal places). It ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...