将Bean转换为Json形式的一个工具类
这边遇到一个问题:
1.做一个bean类,实现一个函数,能够把bean生成json字符串。按字段作为key,字段值作为value的方式生成,并且按key的ascii码的升序生成。
2.提示:bean的字段可以是基本类型(int,long,boolean...),或长用的类类型(Integer,String,Date,ArrayList...)或自己定义的bean对象类型或bean对象类型的数组, ArrayList中也可能包含bean对象类型。可能用的SortMap,接口,反射,递归调用等相关知识
参考了一下别人的博客:链接
但是其中涉及一个问题,就是无法对数组类型的进行转换,当涉及到数组类型的值得时候就会出错,另外原文没有针对ascii进行排序
之后修改之后代码如下,涉及到一些递归的知识以及反射的知识
package com.shenshang.demo.Demo;
import java.lang.reflect.Field;
import java.util.*;
import static jdk.nashorn.internal.runtime.regexp.joni.Config.DEBUG;
/**
* ClassName: BeanToJsonUtil
* Description:
* date: 2019/1/25 11:22
*
* @author tangtang
* @version 1.0
* @since JDK 1.8
*/
public class BeanToJsonUtil {
//需要解决的问题
//1.怎么获取字段名,怎么获取字段的值
//2.怎么判断是基本类型,基本类型的值,不需要加隐含
//3.怎么判断是常用的类型,如果是常用类型里面的集合话,需要递归判断
//4.如何判断是自定义的bean对象 如果是自定义的bean对象,需要再次进行解析,
//5.数组的话,需要遍历展示
//6.将key按照ascii码升序排列
//修改部分:原文存在bug.当类型为数组类型的时候,会出现问题, 以修正为需要的逻辑
public static <T> String toJson(T t) {
if (t == null) {
return "{}";
}
return beanToJson(t);
}
public static <T> String beanToJson(T t) {
//先获取所有字段名
Field[] fields = t.getClass().getDeclaredFields();
String[] keys = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
keys[i] = fields[i].getName();
}
//获取按照Ascii排序之后的顺序
keys = getUrlParam(keys);
StringBuilder sb = new StringBuilder();
sb.append("{");
Map<String, Field> map = new HashMap<>();
for (int i = 0; i < keys.length; i++) {
for (Field field : fields) {
if (field.getName().equals(keys[i])) {
map.put(keys[i], field);
// 当方法名满足键值得时候结束当前层循环
continue;
}
}
}
for (String name : keys) {
Field field = map.get(name);
field.setAccessible(true);
Class<?> type = field.getType();
Object value = null;
try {
value = field.get(t);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 内部类的外部类引用(指针)字段
if (name.contains("this$")) {
continue;
}
String typeName = type.getName();
if (typeName.equals("java.lang.String")) {
try {
sb.append("\"" + name + "\":");
sb.append(stringToJson((String) field.get(t)));
sb.append(",");
} catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
}
}
} else if (typeName.equals("boolean") ||
typeName.equals("java.lang.Boolean") ||
typeName.equals("int") ||
typeName.equals("java.lang.Integer") ||
typeName.equals("float") ||
typeName.equals("java.lang.Float") ||
typeName.equals("double") ||
typeName.equals("java.lang.Double") ||
typeName.equals("long") ||
typeName.equals("java.lang.Long")) {
try {
sb.append("\"" + name + "\":");
sb.append(field.get(t));
sb.append(",");
} catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
}
}
} else if (typeName.equals("java.util.List") ||
typeName.equals("java.util.ArrayList")) {
try {
List<?> objList = (List<?>) field.get(t);
if (null != objList && objList.size() > 0) {
sb.append("\"" + name + "\":");
sb.append("[");
String toJson = listToJson((List<?>) field.get(t));
sb.append(toJson);
sb.setCharAt(sb.length() - 1, ']');
sb.append(",");
}
} catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
}
}
} else if (value.getClass().isArray()) {
Object[] arr = (Object[]) value; // 装换成数组
List list = Arrays.asList(arr);
try {
if (null != list && list.size() > 0) {
sb.append("\"" + name + "\":");
sb.append("[");
String toJson = listToJson(list);
sb.append(toJson);
sb.setCharAt(sb.length() - 1, ']');
sb.append(",");
}
} catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
}
}
} else {
try {
sb.append("\"" + name + "\":");
sb.append("{");
sb.append(beanToJson(field.get(t)));
sb.setCharAt(sb.length() - 1, '}');
sb.append(",");
} catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
}
}
}
}
if (sb.length() == 1) {
sb.append("}");
}
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
/**
* 将 List 对象编码为 JSON格式
*
* @param objList 待封装的对象集合
* @return String:封装后JSONArray String格式
* @version 1.0
*/
private static <T> String listToJson(List<T> objList) {
final StringBuilder sb = new StringBuilder();
for (T t : objList) {
if (t instanceof String) {
sb.append(stringToJson((String) t));
sb.append(",");
} else if (t instanceof Boolean ||
t instanceof Integer ||
t instanceof Float ||
t instanceof Double) {
sb.append(t);
sb.append(",");
} else {
sb.append(beanToJson(t));
sb.append(",");
}
}
return sb.toString();
}
/**
* 将 String 对象编码为 JSON格式,只需处理好特殊字符
*
* @param str String 对象
* @return String:JSON格式
* @version 1.0
*/
private static String stringToJson(final String str) {
if (str == null || str.length() == 0) {
return "\"\"";
}
final StringBuilder sb = new StringBuilder();
sb.append('\"');
for (int i = 0; i < str.length(); i++) {
final char c = str.charAt(i);
sb.append(c == '\"' ? "\\\"" : c == '\\' ? "\\\\"
: c == '/' ? "\\/" : c == '\b' ? "\\b" : c == '\f' ? "\\f"
: c == '\n' ? "\\n" : c == '\r' ? "\\r"
: c == '\t' ? "\\t" : c + "");
}
sb.append('\"');
return sb.toString();
}
/**
* 对字符串数组进行排序
*
* @param keys
* @return
*/
private static String[] getUrlParam(String[] keys) {
for (int i = 0; i < keys.length - 1; i++) {
for (int j = 0; j < keys.length - i - 1; j++) {
String pre = keys[j];
String next = keys[j + 1];
if (isMoreThan(pre, next)) {
String temp = pre;
keys[j] = next;
keys[j + 1] = temp;
}
}
}
return keys;
}
/**
* 比较两个字符串的大小,按字母的ASCII码比较
*
* @param pre
* @param next
* @return
*/
private static boolean isMoreThan(String pre, String next) {
if (null == pre || null == next || "".equals(pre) || "".equals(next)) {
return false;
}
char[] c_pre = pre.toCharArray();
char[] c_next = next.toCharArray();
int minSize = Math.min(c_pre.length, c_next.length);
for (int i = 0; i < minSize; i++) {
if ((int) c_pre[i] > (int) c_next[i]) {
return true;
} else if ((int) c_pre[i] < (int) c_next[i]) {
return false;
}
}
if (c_pre.length > c_next.length) {
return true;
}
return false;
}
}
运行效果图如下:
将Bean转换为Json形式的一个工具类的更多相关文章
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- 通过一个工具类更深入理解动态代理和Threadlocal
动态代理和Threadlocal 一个代理类返回指定的接口,将方法调用指定的调用处理程序的代理类的实例.返回的是一个代理类,由指定的类装载器的定义和实现指定接口指定代理实例调用处理程序最近用到一个工具 ...
- 用Java开发一个工具类,提供似于js中eval函数功能的eval方法
今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...
- JSON转换的原创工具类
进来在项目中总是遇到ArrayList线性表需要转化成JSONArray的场景,或者Java对象和JSON字符串之间的转化问题,于是乎自己写了一个粗糙的工具类,经过初步的测试,暂时还未发现什么bug, ...
- json数据与Gson工具类的使用
JS中使用JSON JSON对象 --> JSON字符串:JSON.stringify(对象) JSON字符串 --> JSON对象:JSON.parse(JSON字符串) <scr ...
- JDBC的增删改写成一个方法,调用一个工具类
package com.hx.jdbc.connection; import java.sql.Connection; import java.sql.Statement; import com.my ...
- Jackson 对象与json数据互转工具类JacksonUtil
1,User对象 package com.st.json; import java.util.Date; /** * @Description: JSON序列化和反序列化使用的User类 * @aut ...
- json转字符串,json转list,json转pojo的工具类
package com.loveshop.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingEx ...
- C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll
引用: Newtonsoft.Json.dll // 引用: using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 定义 实体测试类 ...
随机推荐
- mysql连接数据库时报2003错误怎么解决
mysql 2003是连接错误,连不上服务器. 你目前可以如下方法:进入控制面板->服务管理(我的是管理工具),->服务,然后找到Mysql服务,右键修改属性,改为自启动,以后再重启就没有 ...
- mybatis N+1问题解决
关联嵌套查询 示例: <resultMap id="blogResult" type="Blog"> <association propert ...
- redis的string和list
- leecode刷题(28)-- 二叉树的前序遍历
leecode刷题(28)-- 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 思路 ...
- SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法
最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...
- HTML和CSS学习
HTML和CSS HTML 基础讲解 要点: 标记语言不是编程语言 .html和.htm都是html文档的后缀 标签有围堵和自闭两类 开始标签中可以定义属性,属性的值要用引号引起来 H5一般用于移动端 ...
- render:h => h(App) ----render函数
转载其他博客1 new Vue({ 2 3 router, 4 store, 5 //components: { App } vue1.0的写法 6 render: h => h(App) vu ...
- Elasticsearch没看文档之前,整理的一些知识
1 基础 index -> 数据库 type -> 表 document -> 行 field -> 列 ----------------------------------- ...
- SQL SERVER 中 sp_rename 用法
转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...
- MongoDB系列(三):增删改查(CURD)
上篇讲了MongoDB的基础知识,大家应该对MongoDB有所了解了,当然真正用的还是curd操作,本篇为大家讲解MongoDB的curd操作. 1.数据库操作 #.增 use config #如果数 ...