将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; // 定义 实体测试类 ...
随机推荐
- The minimal unique substring CodeForces - 1159D (构造)
核心观察是形如01,001,0001,...的串循环时, $n$每增长1, $k$就增长1. #include <iostream> #include <sstream> #i ...
- Java后端技术面试汇总(第五套)
1.Java相关 • 乐观悲观锁的设计,如何保证原子性,解决的问题:• char和double的字节,以及在内存的分布是怎样:• 对象内存布局,然后讲下对象的死亡过程?• 对象头,详细讲下:• syn ...
- calc,support,media各自的含义及用法
@support:用于检测浏览器是否支持CSS某个属性,即条件判断,如果支持某个属性,可以写一套样式,如果不支持某属性,提供另一套样式作为替补. calc():用于计算动态函数值,支持“+”,“-”, ...
- SuperMap-WMTS服务修改切片集顺序
1.访问iserver的服务接口,找到WMTS服务接口 2.选择切片集的默认顺序
- deep_learning_Function_numpy.linspace()
numpy.linspace()等差数列函数 在numpy中的linspace()函数类似与arange().range()函数: arange() .range() 可以通过指定开始值.终值和步长创 ...
- 从一道索引数据结构面试题看B树、B+树
题目1: Mysql数据库用过吧?l里面的索引是基于什么数据结构. 答:主要是基于Hash表和B+树 题目2: 很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如 ...
- c++ 数组 结构体
接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting! 一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当 ...
- ValueError: day is out of range for month
日期超出范围. 我当时使用datetime模块生成时间格式数据,手误传错参数导致的结果.所以,好好检查数据就可解决问题. 如下: # 将字符串类型数据转化成时间结构数据# 原想写成如下代码import ...
- Centos的yum源更换为阿里云源
1.备份 # mv /etc/yum.repos.d/CentOS-Base.repo # /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS- ...
- Mac下的LDAP客户端 ApacheDirectoryStudio
mac下的ldap browser,最开始下载的最新版本的 地址 http://directory.apache.org/studio/downloads.html 使用的时候经常卡死,尝试下载老版本 ...