©Copyright 蕃薯耀

©Copyright 蕃薯耀

================================

©Copyright 蕃薯耀 2020-01-07

https://www.cnblogs.com/fanshuyao/

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.ezmorph.Morpher;
import net.sf.ezmorph.MorpherRegistry;
import net.sf.ezmorph.bean.BeanMorpher;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.JSONUtils;

public class JsonUtils {

    @SuppressWarnings("unchecked")
    public static <T> T toClass(String json, Class<T> clazz){
        return (T) JSONObject.toBean(JSONObject.fromObject(json), clazz);
    }

    public JsonUtils() {
    }

    public static String toJson(Object obj) {
        String s = "{}";
        if (obj == null) {
            return s;
        }
        if (!(obj instanceof Collection) && !(obj.getClass().isArray()) && !(obj instanceof JSONArray)) {
            s = JSONObject.fromObject(obj, config).toString();
        } else {
            s = JSONArray.fromObject(obj, config).toString();
        }
        return s;
    }


    /**
     * json转换成Bean,clazz指定的整个json转换的类型
     * 如果这个bean里面还有其他自定义类型(List,Array不包括,会自动转换)不知道如何转换只能用MorphDynaBean
     * 解决办法请看jsonToBean(String s, Class clazz, Map map)中的map来指定类型
     * jsonToBean只适合JsonObject,isArray为true不满足,json形式最外层为{}而不能为[]
     */
    public static Object jsonToBean(String s, Class<?> clazz) {
        return jsonToBean(s, clazz, null);
    }

    public static Object jsonToBean(String s, Class<?> clazz, Map<String,?> typemap) {
        return trans2Bean(JSONObject.fromObject(s), clazz, typemap);
    }


    private static Object trans2Bean(JSONObject jsonobject, Class<?> class1, Map<String,?> map) {
        return JSONObject.toBean(jsonobject, class1, map);
    }


    /**
     * 将MorphDynaBean类型的对象转换成指定的类型对象
     */
    public static Object translateMorphDynaBean(Class<?> outclazz, Object obj) {
        MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry();
        Morpher dynaMorpher = new BeanMorpher(outclazz,morpherRegistry);
        morpherRegistry.registerMorpher(dynaMorpher);
        return morpherRegistry.morph(outclazz,obj);

    }

    @SuppressWarnings("rawtypes")
    public static List jsonArrayToList(String json) {
        return JSONArray.fromObject(json);
    }

    /**
     * 将最外层为[]的json转换成List对象
     * jsonToBean只适合json最外层为{}形式
     * 可以指定class,里面元素形式为{} 将元素转换成指定类型  [{},{}]
     * 但是要求里面元素必须是{}包含,如果如[[],[]]json形式不适合JsonObject
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static List jsonArrayToList(String json, Class clazz) {
        if (json == null || "".equals(json)) {
           return null;
        }
        if (clazz == null) {
            return JSONArray.fromObject(json);
        }
        List arraylist = new ArrayList();
        for (Iterator iterator = JSONArray.fromObject(json).iterator(); iterator.hasNext(); ) {
            arraylist.add(trans2Bean(((JSONObject) iterator.next()), clazz, null));
        };
        return arraylist;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static List jsonArrayToList(String json,Class clazz, Map mapType) {
        if (json == null || "".equals(json)) {
            return null;
        }
        if (clazz == null) {
            return JSONArray.fromObject(json);
        }
        List arraylist = new ArrayList();
        for (Iterator iterator = JSONArray.fromObject(json).iterator(); iterator.hasNext(); ) {
            arraylist.add(trans2Bean(((JSONObject) iterator.next()), clazz, mapType));
        };
        return arraylist;
    }


    /**
     * jsonToMap可以用jsonToBean来代替
     * @param s
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Map jsonToMap(String json) {
        return JSONObject.fromObject(json);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Map jsonToMap(String json, Class class1) {
        if(json == null || "".equals(json)) {
            return null;
        }
        JSONObject jsonobject = JSONObject.fromObject(json);
        HashMap hashmap = new HashMap();
        String s1 = null;
        for (Iterator iterator = jsonobject.keys(); iterator.hasNext(); ) {
            s1 = (String) iterator.next();
            hashmap.put(s1,trans2Bean(jsonobject.getJSONObject(s1), class1, null));
        }

        return hashmap;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Map jsonToMap(String json, Class class1, Map map) {
        if(json == null || "".equals(json)) {
           return null;
        }
        JSONObject jsonobject = JSONObject.fromObject(json);
        HashMap hashmap = new HashMap();
        String s1;
        for (Iterator iterator = jsonobject.keys(); iterator.hasNext(); ) {
            s1 = (String) iterator.next();
            hashmap.put(s1,trans2Bean(jsonobject.getJSONObject(s1), class1, map));
        }

        return hashmap;
    }


    public static String escape(String s) {
        Pattern pattern = Pattern.compile("[\\\\|'|\\r|\\n]");
        Matcher matcher = pattern.matcher(s);
        StringBuffer stringbuffer = new StringBuffer();
        while (matcher.find())
            if ("\\".equals(matcher.group()))
                matcher.appendReplacement(stringbuffer, "\\\\\\\\");
            else if ("'".equals(matcher.group()))
                matcher.appendReplacement(stringbuffer, "\\\\'");
            else if ("\r".equals(matcher.group()))
                matcher.appendReplacement(stringbuffer, "\\\\r");
            else if ("\n".equals(matcher.group()))
                matcher.appendReplacement(stringbuffer, "\\\\n");
        matcher.appendTail(stringbuffer);
        return stringbuffer.toString();
    }

    private static final JsonConfig config;

    static {
        config = new JsonConfig();
        //使用jsonConfig的setCycleDetectionStrategy()方法进行忽略死循环。
        //bK.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
        //需要注意的是完整的放到最前面,如果简单的放到前面,匹配范围变大了如:yyyy-MM-dd 匹配2012-05-21 13:13:11
        JSONUtils.getMorpherRegistry()
        .registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"}));
        //时间如java.sql.Date的处理
        config.registerJsonValueProcessor(java.sql.Date.class, new DateJsonValueProcessor("yyyy-MM-dd"));
        //时间为java.util.Date处理
        config.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
        //时间为java.sql.Timestamp处理
        config.registerJsonValueProcessor(java.sql.Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
        //时间为java.math.BigDecimal处理
        config.registerJsonValueProcessor(java.math.BigDecimal.class, new NumberJsonValueProcessor());
    }

    // 时间转换内部类
    public static class DateJsonValueProcessor implements JsonValueProcessor {
        private static final String defaultFormat = "yyyy-MM-dd";
        private DateFormat dataFormat;
        // 构造函数
        public DateJsonValueProcessor() {
            dataFormat = new SimpleDateFormat(defaultFormat);
        }

        public DateJsonValueProcessor(String s) {
            dataFormat = new SimpleDateFormat(s);
        }

        //如果是List<Date>类型,这里面obj值得是集合一个元素Date
        public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
            return process(obj);
        }

        @Override
        public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
            return process(obj);
        }

        //如果是java.sql.Date类型,这里强转是否会存在问题
        //这里因为Date是java.util.Date类型,java.sql.Date是java.util.Date的子类
        //自动向上转型可以知道,这里强转是合理的
        private Object process(Object obj) {
            return obj != null ? dataFormat.format((Date)obj) : "";
        }
    }

    //BigDecimal转换为Json发生截断 处理
    public static class NumberJsonValueProcessor implements JsonValueProcessor {

        @Override
        public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
            return process(obj);
        }

        @Override
        public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
            return process(obj);
        }

        private Object process(Object obj) {
            return obj != null ? obj.toString() : "";
        }
    }


}

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!) 

================================

©Copyright 蕃薯耀 2020-01-07

https://www.cnblogs.com/fanshuyao/

12-23 21:57