进来在项目中总是遇到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. BG.Hive - part3

    1. Hive数据导入 - Load Load,加载,不会进行任何数据转换和处理的操作,只会进行数据Move操作,将元数据移动到HDFS指定目录 a> hdfs dfs -put 'hdfs的h ...

  2. github上老外做的jQuery虚拟键盘

    jQuery官方比较迟滞的更新版本: http://plugins.jquery.com/keyboard/ 最新版本更新官方地址: https://github.com/Mottie/Keyboar ...

  3. 面向对象(static关键字的特点)

    static关键字的特点 * a:随着类的加载而加载 * b:优先于对象存在 * c:被类的所有对象共享 * 举例:咱们班级的学生应该共用同一个班级编号. * 其实这个特点也是在告诉我们什么时候使用静 ...

  4. [LeetCode]Flatten Binary Tree to Linked List题解(二叉树)

    Flatten Binary Tree to Linked List: Given a binary tree, flatten it to a linked list in-place. For e ...

  5. 高并发第十单:J.U.C AQS(AbstractQueuedSynchronizer) 组件:CountDownLatch. CyclicBarrier .Semaphore

    这里有一篇介绍AQS的文章 非常好: Java并发之AQS详解 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下lo ...

  6. Go 语言实现 HTTP 层面的反向代理

    最近对 Go 语言的反向代理使用得偏多,其实在大概两年前就写过 TCP 层面的代理,而且那时也是用的 Go 语言,不同之处在于之前只是偶尔尝试一下使用,最近是因为工作需要使用的.相比较于 TCP 层面 ...

  7. CF696C PLEASE

    矩阵快速幂+扩展欧拉定理 对于一个矩阵\(A\),我们有\(A^n \equiv A^{n\% \phi(m)+\phi(m)}(\%m)\) 经过简单的列举或推导可得 设目前进行了\(x\)轮,\( ...

  8. css的元素表现

    块级元素和行内元素的表现: 块级元素:块级元素和父元素的宽度一致,默认情况下就是和body的宽度一样,也可以说和浏览器窗口的宽度一致,致使同一行不能再放下另外的元素,所以块级元素表现为独占一行. 块级 ...

  9. css sprites的原理和作用

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...

  10. <Android 基础(二十六)> 渐变色圆角Button

    简介 总结下之前看的自定义View的内容,结合一个简单的例子,阐述下基本用法和大致的使用流程,这个例子比较简单,更复杂的自定义View,随着自己的学习,后面再慢慢添加.作为一个Android开发者,这 ...