将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; // 定义 实体测试类 ...
随机推荐
- sql server lower函数
lower()函数 --将大写字符数据转换为小写字符数据 语法:lower(character_expression) --character_expression是指定要进行转换的字符串
- Get MySQL这5个优化技巧
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...
- CentOS7搭建FastDFS V5.11分布式文件系统(一)
1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...
- 为你的docker容器增加一个健康检查机制
1.健康检查 在分布式系统中,经常需要利用健康检查机制来检查服务的可用性,防止其他服务调用时出现异常.自 1.12 版本之后,Docker 引入了原生的健康检查实现. 如何给Docke配置原生健康检查 ...
- QT 托盘 hover事件捕捉
1. QSystemTrayIcon hover事件 参考:https://stackoverflow.com/questions/21795919/how-to-catch-the-mousehov ...
- 2019-2020-1 20199319《Linux内核原理与分析》第四周作业
MenuOS的构造 基础知识 1.操作系统的两把宝剑:①中断上下文的切换:保存现场和恢复现场:②进程上下文的切换. 2.Linux内核以A.B.C.D方式命名:A和B变得无关紧要,C是内核的真实版本, ...
- linux pip使用国内源
最近在Linux里面使用pip安装应用的速度十分的慢,于是便上网找了一些国内的源. 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:https:// ...
- python分别获取虚拟网卡和真实网卡ip
#!/usr/bin/python # -*- coding: utf-8 -*- import commands import socket import fcntl import struct C ...
- redis如何查看主从状态信息master和salve
首先你需要连接上redis [root@localhost src]# ./redis-cli -p 6384 --第一步从客户端命令工具连接redis 127.0.0.1:6384> auth ...
- ZenCart通过Contact Us接收垃圾邮件的过滤方案
最近收到一些通过Contact Us进行垃圾外链群发的邮件,虽然可以通过在Contact Us增加验证码来解决,但不利于客户体验.所以我们可以通过简单的关键词过滤来实现,一般垃圾外链都含有“[url= ...