JSON轉換的原創工具類


進來在項目中總是遇到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工具類,請大家參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM