如题
entity pojo vo 转换为 string 或 json
这个是我在代码中 要 记录 日志 , 我们 用的是hibernate 所以 关联 的表 嵌套的表 和多 ,层次 也很深 。
用 其他的 一些 转换 成 string 的 方法 、类, 有时 会出现 死循环 。 由此 写 这个 类。
好了 , 不说了 ,直接代码。
工具类
package com.ly.utils;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: EntityToString
* @Description: entity pojo vo 转换为 string
* @author linyan
* @date 2017年9月22日 上午11:08:32
*
*/
public class EntityToString {
//定义基本类型
static Map<Class<?>, Object> classes = new HashMap<Class<?>, Object>();
//定义超过此长度截取
static Integer subStrLength = 200;
static{
classes.put(byte.class, "");
classes.put(short.class, "");
classes.put(int.class, "");
classes.put(long.class, "");
classes.put(float.class, "");
classes.put(double.class, "");
classes.put(char.class, "");
classes.put(boolean.class, "");
classes.put(Byte.class, "");
classes.put(Short.class, "");
classes.put(Integer.class, "");
classes.put(Long.class, "");
classes.put(Float.class, "");
classes.put(Double.class, "");
classes.put(Character.class, "");
classes.put(Boolean.class, "");
classes.put(String.class, "");
}
/**
* @Title: getString
* @author: linyan
* @Description:
* @param o 需要转换的对象
* @return
*/
public static String getString(Object o) {
return getString(o,1);
}
/**
* @Title: getString
* @author: linyan
* @Description:
* @param o 需要转换的对象
* @param endLeve 结束 等级
* @return
*/
public static String getString(Object o,Integer endLeve ) {
return getString(o,0,endLeve);
}
/**
* @Title: getString
* @author: linyan
* @Description:
* @param o 需要转换的对象
* @param leve 等级
* @param endLeve 结束 等级
* @return
*/
public static String getString(Object o,Integer leve,Integer endLeve )
{
Integer lev = leve + 1;
Class<?> c = o.getClass();
String result = "";
if (leve==0) {
result+=c.getSimpleName();
}
result+= "{";
// 获取类中的所有定义字段
Field[] fields = c.getDeclaredFields();
//循环遍历字段,获取字段对应的值
for (Field field : fields)
{
// 如果不为空,设置可见性(也就是设置私有变量可以访问),然后返回
field.setAccessible(true);
try
{
//有值
if(field.get(o) != null){
Class<?> fieldClass = field.get(o).getClass();
//如果是基本类型 直接 取值 用get直接取
if(classes.containsKey(fieldClass)){
result += field.getName() + "=" + subStr(field.get(o)) +",";
}else if(field.get( o ) instanceof Iterable ){ // 迭代器 类型的
result += field.getName()+ " = ";
result += iterableClass(field.get( o ),leve,endLeve);
}else if(field.get( o ) instanceof Map){ // Map 类型的
result += field.getName( )+ " = ";
result += mapClass(field.get(o), leve, endLeve);
}else if(fieldClass.isArray()){ // 数组类型
Object object = field.get(o);
result += field.getName()+ " = ";
result += arrayClass(object, leve, endLeve);
}else { // 其他 类型的
/*这个判断是我 自己加的 只对 我现在的项目 有用
判断 字段值 的 包名 中 是否 有 entity 并且 现在的层级 不能 大于 结束 层级
如果有 就是 自己写的类 那么字段的 值 也 要 生成 为 string 类型
*/
if (fieldClass.getCanonicalName().indexOf("entity")>-1&&leve!=endLeve) {
result += field.getName() + "=" + getString(field.get(o),lev,endLeve) +",";
}else { // 这个就是真正的 其他类型了 如 file 等
result += field.getName() + "=" + field.get(o) +",";
}
}
}else {
//没有值
result += field.getName() + "=" + field.get(o) +",";
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
//去除 最后一个 ,
if(result.indexOf(",")>=0) result = result.substring(0 , result.length()-1);
return result+"}";
}
/**
* @Title: iterableClass
* @author: linyan
* @Description: 迭代器 类型
* @param obj
* @param leve
* @param endLeve
* @return
*/
public static String iterableClass(Object obj,Integer leve,Integer endLeve){
String result = "[";
Iterable<?> ite = (Iterable<?>)obj;
for (Object object : ite) {
if(object != null){
if (classes.containsKey(object.getClass())) {
result += subStr(object) +",";
}else if(object instanceof Iterable){
result += iterableClass(object,leve,endLeve);
}else if(object instanceof Map){
result += mapClass(object, leve, endLeve);
}else if(object.getClass().isArray()){
result += arrayClass(object, leve, endLeve);
}else {
result += elseClass(object,leve,endLeve);
}
}else{
result += null;
}
}
if(result.indexOf( "," )>=0) result = result.substring( 0 , result.length()-1 );
result += "],";
return result;
}
/**
* @Title: mapClass
* @author: linyan
* @Description: Map 类型
* @param obj
* @param leve
* @param endLeve
* @return
*/
public static String mapClass(Object obj,Integer leve,Integer endLeve){
String result = "{";
Map<?,?> map1 = (Map<?,?>)obj;
for (Map.Entry<?, ?> entry1 : map1.entrySet()) {
if (entry1.getValue() != null) {
if (classes.containsKey(entry1.getValue().getClass())) {
result += entry1.getKey()+"="+ subStr(entry1.getValue()) +",";
}else if(entry1.getValue() instanceof Iterable){
result += entry1.getKey()+ "=" + iterableClass(entry1.getValue(),leve,endLeve);
}else if(entry1.getValue() instanceof Map){
result += entry1.getKey()+ "=" + mapClass(entry1.getValue(),leve,endLeve);
}else if(obj.getClass().isArray()){
result += entry1.getKey()+ "=" + arrayClass(entry1.getValue(), leve, endLeve);
}else {
result += entry1.getKey()+ "=" + elseClass(entry1.getValue(),leve,endLeve);
}
}else{
result += null;
}
}
if(result.indexOf( "," )>=0) result = result.substring( 0 , result.length()-1 );
result += "},";
return result;
}
/**
* @Title: arrayClass
* @author: linyan
* @Description: 数组 类型
* @param object
* @param leve
* @param endLeve
* @return
*/
public static String arrayClass(Object object,Integer leve,Integer endLeve){
String result = "[";
int length = Array.getLength(object) ;
for (int i = 0; i < length; i++) {
Object object2 = Array.get(object,i);
if (object2!=null) {
if (classes.containsKey(object2.getClass())) {
result += subStr(object2)+",";
}else if(object2 instanceof Iterable){
result += iterableClass(object2,leve,endLeve);
}else if (object2 instanceof Map) {
result += mapClass(object2, leve, endLeve);
}else if (object2.getClass().isArray()) {
result += arrayClass(object2, leve, endLeve);
}else {
result += elseClass(object2,leve,endLeve);
}
}else{
result += null;
}
}
if(result.indexOf( "," )>=0) result = result.substring( 0 , result.length()-1 );
result += "],";
return result;
}
/**
* @Title: elseClass
* @author: linyan
* @Description: 其他类型
* @param object
* @param leve
* @param endLeve
* @return
*/
public static String elseClass(Object object,Integer leve,Integer endLeve){
String result = "";
Integer le = leve + 1;
if (object.getClass().getCanonicalName().indexOf("entity")>-1&&leve!=endLeve) {
// 设置字段可见,即可用get方法获取属性值。
result += getString(object,le,endLeve) +",";
}else {
// 设置字段可见,即可用get方法获取属性值。
result += object+",";
}
return result;
}
/**
* @Title: subStr
* @author: linyan
* @Description: 截取字符串
* @param object
* @return
*/
public static String subStr(Object object){
if (object!=null) {
if (object.toString().length()>subStrLength) {
return object.toString().substring(0, subStrLength);
}else{
return object.toString();
}
}else{
return "";
}
}
}
测试类1
package entity;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @ClassName: Test1
* @Description:
* @author linyan
* @date 2017年9月26日 上午10:40:46
*
*/
public class Test1 {
private String abc;
private Integer inte;
private boolean bool;
private char ch;
private double dou;
private long lo;
private Map<String,Object> map;
private List<String> list;
private Set<Test2> set;
private String[] strs;
private File file;
private Test2 test2;
public String getAbc() {
return abc;
}
public void setAbc(String abc) {
this.abc = abc;
}
public Integer getInte() {
return inte;
}
public void setInte(Integer inte) {
this.inte = inte;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public char getCh() {
return ch;
}
public void setCh(char ch) {
this.ch = ch;
}
public double getDou() {
return dou;
}
public void setDou(double dou) {
this.dou = dou;
}
public long getLo() {
return lo;
}
public void setLo(long lo) {
this.lo = lo;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<Test2> getSet() {
return set;
}
public void setSet(Set<Test2> set) {
this.set = set;
}
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public Test2 getTest2() {
return test2;
}
public void setTest2(Test2 test2) {
this.test2 = test2;
}
}
测试类2
package entity;
/**
* @ClassName: Test2
* @Description:
* @author linyan
* @date 2017年9月26日 上午10:40:53
*
*/
public class Test2 {
private String a;
private Test1 test1;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Test1 getTest1() {
return test1;
}
public void setTest1(Test1 test1) {
this.test1 = test1;
}
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "gas;ldkf");
map.put("ex", 45);
File file = new File("d:/test.txt");
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
String[] strs = new String[3];
strs = list.toArray(strs);
Test1 test1 = new Test1();
test1.setAbc("agcsgdb");
test1.setBool(false);
test1.setCh('o');
test1.setDou(5465.15);
test1.setFile(file);
test1.setInte(123456);
test1.setList(list);
test1.setLo(987654L);
test1.setMap(map);
test1.setStrs(strs);
Test2 test2 = new Test2();
test2.setA("aaaaaaaaaaaa");
test2.setTest1(test1);
test1.setTest2(test2);
Set<Test2> set = new HashSet<Test2>();
set.add(test2);
Test2 test22 = new Test2();
test22.setA("bbbbbbbbbbb");
test22.setTest1(test1);
set.add(test22);
test1.setSet(set);
String entityToString = EntityToString.getString(test1,2);
System.out.println(entityToString);
}
输出结果
Test1
{
abc=agcsgdb,
inte=123456,
bool=false,
ch=o,
dou=5465.15,
lo=987654,
map={
ex=45,
name=gas;ldkf
},
list=[
a,
b,
c
],
set=[
{
a=aaaaaaaaaaaa,
test1={
abc=agcsgdb,
inte=123456,
bool=false,
ch=o,
dou=5465.15,
lo=987654,
map={
ex=45,
name=gas;ldkf
},
list=[
a,
b,
c
],
set=[
entity.Test2@15db9742,
entity.Test2@6d06d69c
],
strs=[
a,
b,
c
],
file=d: \test.txt,
test2=entity.Test2@15db9742
}
},
{
a=bbbbbbbbbbb,
test1={
abc=agcsgdb,
inte=123456,
bool=false,
ch=o,
dou=5465.15,
lo=987654,
map={
ex=45,
name=gas;ldkf
},
list=[
a,
b,
c
],
set=[
entity.Test2@15db9742,
entity.Test2@6d06d69c
],
strs=[
a,
b,
c
],
file=d: \test.txt,
test2=entity.Test2@15db9742
}
}
],
strs=[
a,
b,
c
],
file=d: \test.txt,
test2={
a=aaaaaaaaaaaa,
test1={
abc=agcsgdb,
inte=123456,
bool=false,
ch=o,
dou=5465.15,
lo=987654,
map={
ex=45,
name=gas;ldkf
},
list=[
a,
b,
c
],
set=[
entity.Test2@15db9742,
entity.Test2@6d06d69c
],
strs=[
a,
b,
c
],
file=d: \test.txt,
test2=entity.Test2@15db9742
}
}
}