为实体类增加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 ...
随机推荐
- HTML5 进阶系列:canvas 动态图表
前言 canvas 强大的功能让它成为了 HTML5 中非常重要的部分,至于它是什么,这里就不需要我多作介绍了.而可视化图表,则是 canvas 强大功能的表现之一. 现在已经有了很多成熟的图表插件都 ...
- [转载]OpenStack OVS GRE/VXLAN网络
学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网络部分:30%的时间花费在了存储方面:20%的时间花费在了计算方面.OpenStack网络是不得不逾越的鸿沟,接下来我们一起尝 ...
- C# 特性参数(注解属性加在参数前面)
特性参数 webapi 框架里有很多特性参数,为了解除一些新人的疑惑,写个小例子分享下. class Program { static void Main(string[] args) { var m ...
- PF2.1版本总结,在设计过程中遇到的问题以及技术分享
在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久.可是无论怎样,PF2.1带着自身的完善总算不负所望推出.在这次的版本调整中让我深有体会到了程序设计中 ...
- SignalR来做实时Web聊天
本章和大家分享的内容是使用Signal R框架创建个简易的群聊功能,主要讲解如何在.Net的MVC中使用这个框架,由于这个项目有官方文档(当然全英文),后面也不打算写分享篇了,主要目的是让朋友们在需要 ...
- No matching provisioning profiles found for "Applications/MyApp.app”问题解决
新开发的一个app打包报错,度娘谷歌了好久,废了不少时间,发现错误提示已经很明显了,只是自己没读懂而已,先说下问题和解决方法,给同意遇到这个问题的你: Failed to locate or gene ...
- Android依赖管理与私服搭建
在Android开发中,一个项目需要依赖许多的库,我们自己写的,第三方的等等,这篇文件介绍的就是自己搭建私服,创建自己的仓库,进行对我们自己写的库依赖管理.本文是在 mac book pro 环境上搭 ...
- TreeMap集合特点、排序原理
TreeMap特点(类似于TreeSet): 1.无序,不允许重复(无序指元素顺序与添加顺序不一致) 2.TreeMap集合默认会对键进行排序,所以键必须实现自然排序和定制排序中的一种 3..底层使用 ...
- IE低版本兼容的感悟
2017-04-09 曾经折磨一代人的兼容问题,如今也在同样折磨着我们,明明可以做JS判断来避免对ie低版本的兼容,但是却还是耐心的做着兼容,你可能会问这是为什么, 我们调的不是兼容,是整整一代人的情 ...
- [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)
前言:基于百度地图javascript版本开发,百度地图中所用的key已承诺仅用于测试,不用于商业用途 注:本文所有代码可以到github上进行下载,github地址:http://map.eguid ...