进来在项目中总是遇到ArrayList线性表需要转化成JSONArray的场景,或者Java对象和JSON字符串之间的转化问题,于是乎自己写了一个粗糙的工具类,经过初步的测试,暂时还未发现什么bug,现在将代码贴出来,有兴趣的朋友可以拿过去玩一玩。

首先导入jar包,fastjson-1.2.2.jar 以及 jodd-3.3.2.jar 两个jar包,在这里再次感谢温少的fastjson。谨以此向温少致敬。

上代码:

package com.sunyard.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.List; import jodd.bean.BeanUtil; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; /**
* JSON操作工具类
* @author jiw.yu@sunyard.com
* @time 2017-7-22
* @version 1.0
* @since 1.0
* @package com.sunyard.util
*/
public abstract class JSONUtil {
/**
* Java对象转JSON字符串
* @param @param obj
* @param @return
* @return String
* @throws
*/
public static String objectToJson(Object obj){
return JSON.toJSONString(obj);
} /**
* JSON字符串转化JAVA对象
* @param @param jsonStr
* @param @param clazz
* @param @return
* @return Object
* @throws
*/
public static Object jsonToObject(String jsonStr,Class<? extends Object> clazz){
Object obj = null;
try {
obj = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
Field[] fields = clazz.getDeclaredFields();
JSONObject json = JSONObject.parseObject(jsonStr);
for(Field f : fields){
initBean(json,f,obj);
}
return obj;
} private static void initBean(JSONObject json, Field field, Object obj) {
String fieldName = field.getName();
Class<? extends Object> clazz = obj.getClass();
Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods){
Class<?> type = BeanUtil.getPropertyType(obj, fieldName);
String methodName = method.getName();
if(methodName.startsWith("set")){
methodName = methodName.substring(3, methodName.length());
String typeName = type.getName();
if("String".equals(typeName) || String.class.getName().equals(typeName)){
String fieldValue = json.getString(fieldName);
methodInvoke(method, methodName, fieldName, obj, fieldValue);
} else if("int".equals(typeName) || Integer.class.getName().equals(typeName)){
Integer fieldValue = Integer.parseInt(json.getString(fieldName));
methodInvoke(method, methodName, fieldName, obj, fieldValue);
} else if("double".equals(typeName) || Double.class.getName().equals(typeName)){
Double fieldValue = Double.parseDouble(json.getString(fieldName));
methodInvoke(method, methodName, fieldName, obj, fieldValue);
} else if("float".equals(typeName) || Float.class.getName().equals(typeName)){
Float fieldValue = Float.parseFloat(json.getString(fieldName));
methodInvoke(method, methodName, fieldName, obj, fieldValue);
} else if("long".equals(typeName) || Long.class.getName().equals(typeName)){
Long fieldValue = Long.parseLong(json.getString(fieldName));
methodInvoke(method, methodName, fieldName, obj, fieldValue);
} else if("BigDecimal".equals(typeName) || BigDecimal.class.getName().equals(typeName)){
BigDecimal fieldValue = new BigDecimal(json.getString(fieldName));
methodInvoke(method, methodName, fieldName, obj, fieldValue);
}
}
}
} private static void methodInvoke(Method method,String methodName, String fieldName,
Object obj, Object fieldValue) {
if(methodName .equalsIgnoreCase(fieldName)){
try {
method.invoke(obj, fieldValue);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} /**
* 线性表转化为JSON数组
* @param @param list
* @param @return
* @throws Exception
*/
public static JSONArray listToJson(List<? extends Object> list) throws Exception{
JSONArray array = new JSONArray();
for(Object obj : list){
Class<? extends Object> clazz = obj.getClass();
Field[] flelds = clazz.getDeclaredFields();
Method[] methods = clazz.getMethods();
JSONObject json = new JSONObject();
for(int i = 0;i < flelds.length;i++){
String fieldName = flelds[i].getName();
for(int j = 0;j < methods.length;j++){
String methodName = methods[j].getName();
if(isGetMethod(methodName, fieldName)){
Object result = methods[j].invoke(obj,null);
json.put(fieldName.toLowerCase(), !StringUtil.isEmpty(String.valueOf(result))
? String.valueOf(result) : StringUtil.EMPTY);
}
}
}
array.add(json);
}
return array;
} /**
* 判断是否是get方法
* @param @param method
* @param @return
*/
private static boolean isGetMethod(String methodName,String fieldName){
if(methodName.startsWith("get") && !"getClass".equalsIgnoreCase(methodName)){
methodName = methodName.substring(3, methodName.length());
return StringUtil.equalsIgnoreCase(methodName, fieldName);
}
return false;
} }

编写测试方法:

public static void main(String[] args) throws Exception {
User user1 = new User();
user1.setName("张三");
user1.setAge(22);
user1.setSalary(44.33); User user2 = new User();
user2.setName("李四");
user2.setAge(33);
user2.setSalary(53.99); List<User> users = new ArrayList<User>();
users.add(user1);
users.add(user2); String user1str = objectToJson(user1);
System.out.println("测试objectToJson : " + user1str); User user = (User) jsonToObject(user1str, User.class);
System.out.println("测试jsonToObject : " + user); JSONArray array = listToJson(users);
System.out.println("测试listToJson : " + array);
}

控制台输出结果:

测试objectToJson : {"age":22,"name":"张三","salary":44.33}
测试jsonToObject : User [name=张三, age=22, salary=44.33]
测试listToJson : [{"age":"22","name":"张三","salary":"44.33"},{"age":"33","name":"李四","salary":"53.99"}]

可以很清楚的看到我们要转换的数据都转换成功了,其实表面看起来也是没有bug的,但是在某些特殊的情况下会不会有问题就不得而知了。JSON工具类,请大家参考。

JSON转换的原创工具类的更多相关文章

  1. json数据与Gson工具类的使用

    JS中使用JSON JSON对象 --> JSON字符串:JSON.stringify(对象) JSON字符串 --> JSON对象:JSON.parse(JSON字符串) <scr ...

  2. json转字符串,json转list,json转pojo的工具类

    package com.loveshop.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingEx ...

  3. java将秒转换为时分秒工具类

    需要一个接收时分秒的对象,如下: package com.dq.schoolcontract.utils; import com.sun.media.jfxmedia.control.VideoRen ...

  4. Jackson 对象与json数据互转工具类JacksonUtil

    1,User对象 package com.st.json; import java.util.Date; /** * @Description: JSON序列化和反序列化使用的User类 * @aut ...

  5. C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll

    引用: Newtonsoft.Json.dll // 引用: using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 定义 实体测试类 ...

  6. 将Bean转换为Json形式的一个工具类

    这边遇到一个问题:  1.做一个bean类,实现一个函数,能够把bean生成json字符串.按字段作为key,字段值作为value的方式生成,并且按key的ascii码的升序生成.     2.提示: ...

  7. 把实体bean对象转换成DBObject工具类

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util ...

  8. 自己写了一个解析json为table的工具类

    还需要完善的包括,css的封装,触发事件,数据的获得处理: <!DOCTYPE html> <html> <head> <meta charset=" ...

  9. JAVA结合 JSON Web Token(JWT) 工具类

    引入java-jwt-3.3.0.jar .  jjwt-0.9.0.jar .jackson-all-1.7.6.jar 或者maven <!-- https://mvnrepository. ...

随机推荐

  1. css3如何实现圆角边框

    圆角边框是css3新增属性,在圆角边框出现之前,前端开发有的采用整块的圆角图片作为背景,有的采用小的圆角图片分别放在元素的四角,非常麻烦,灵活性差,也达到降低了网站的整体性能,而圆角边的出现则降低了开 ...

  2. Angular待办事项应用4——模拟web服务

    内存服务器 angular提供了一个快速建立测试用的web服务方法,内存服务器(in-memory),让我们不用等待后端开发的进度 安装npm包 npm install --save angular- ...

  3. macOS 中文件属性有at符号

    在mac os 下 HFS+的文件系统里,有时候有些文件会附加上mac的专有属性,@属性就表示文件或文件夹是来自互联网下载 xattr -l 文件名:查看attrxattr -d 属性名:删除attr

  4. C# 使用/配置Log4Net

    1.首先在项目中添加Nuget程序包... 2.然后在NuGet窗体中搜索Log4Net,然后点击安装<安装过程可能会持续几分钟,请耐心等待> 3.在项目中添加一个Config文件,如已有 ...

  5. [javaSE] 网络编程(TCP,UDP,Socket特点)

    UDP特点: 面向无连接,把数据打包发过去,收不收得到我不管 数据大小有限制,一次不能超过64k,可以分成多个包 这是个不可靠的协议 速度很快 视频直播,凌波客户端,feiQ都是UDP协议 TCP特点 ...

  6. NSDictionary 和NSArray 排序(sort)

    排序: NSMutableDictionary *dic=[[NSMutableDictionary alloc]init]; [dic setValue:@"第3个" forKe ...

  7. 网络基础1_TCP和HTTP

    TCP/IP 是互联网相关的各类协议族的总称,并且进行分层,分为应用层,传输层,网络层,数据链路层这四层协议,分层的好处,是便于后期的优化与改进,扩展性好 应用层:主要为客户提供应用服务,       ...

  8. JAVA 项目 调用外部的WebSerivce接口,入门实例 (一)

    前言: 第一次接触WebService,工作需要,调用外部的WebService接口,所以暂时我这里不考虑发布,做个记录,待以后回来可以看看,只是最初级的,所以有何不好.不对的地方,欢迎看到的同僚给予 ...

  9. ReadWriteLock

    ReadWriteLock也是一个接口,只有两个方法 一个用来获取读锁,一个用来获取写锁.也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作.下面的Reentra ...

  10. Go 中包导入声明

    Go中的程序由软件包组成.通常,软件包依赖于其他软件包,或者内置于标准库或第三方的软件包.包需要先导入才能使用其导出的标识符.本文将翻译一篇国外的文章,用于介绍包导入的原理以及几种常用的导入方式. & ...