查看: 3113|回复: 2

[Java新手区] xml ,json, object之间格式互转【福利】

[复制链接]
  • TA的每日心情
    开心
    2015-3-4 12:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-6-4 16:07:00 | 显示全部楼层 |阅读模式
    package com.th.supcom.framework.commoms.uitls;

    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;

    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang.ArrayUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.lang.SystemUtils;
    import org.codehaus.jettison.json.JSONObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.converters.SingleValueConverter;
    import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

    /**
    * 使用XStreamAPI对xml的String和Object进行相互转换<br>
    * 使用XStreamAPI对json的String和Object进行相互转换<br>
    */
    public final class FcXStreamUtil
    {
        /** 默认时间转换格式 */
        private static final SingleValueConverter DEFAULTCONVERTER = new SingleValueConverter ()
        {
            @Override
            public boolean canConvert (@SuppressWarnings ("rawtypes") Class class1)
            {
                return class1.equals (java.util.Date.class);
            }

            @Override
            public String toString (Object obj)
            {
                Date date = (Date) obj;
                return FcDateTimeUtil.dateToString (date);
            }

            @Override
            public Object fromString (String s)
            {
                return FcDateTimeUtil.stringToDate (s);
            }
        };

        /** 统一的字符串xml头标签,用于网络传输时保证编码格式统一 */
        public static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

        private FcXStreamUtil ()
        {

        }

        /**
         * 将对象转换成xml字符串,字符串带有类包名称和前缀
         *
         * @param object
         * @return xml结果的字符串
         */
        public static String objectToString (Object object)
        {
            return objectToString (object, "");
        }

        /**
         * 带有类包名称和前缀的字符串转换对象
         *
         * @param xmlString
         * @return
         */
        public static Object stringToObject (String xmlString)
        {
            return stringToObject (xmlString, "");
        }

        /**
         * 将对象换成字符串xml,并且将属性的前缀去掉。
         *
         * @param object
         * @param attributePre
         * @return
         */
        public static String objectToString (Object object, String attributePre)
        {
            return objectToString (object, attributePre, true);
        }

        /**
         * 将去掉属性的前缀的xml字符串还原对象,xml中含有类的包名称
         *
         * @param xmlString
         * @return
         */
        public static Object stringToObject (String xmlString, String attributePre)
        {
            return stringToObject (xmlString, attributePre, true);
        }

        /**
         * 将对象换成字符串xml,并且将属性的前缀去掉。
         *
         * @param object
         * @param attributePre
         * @param initcap 是否首字母大写 true:即首字母大写
         * @return
         */
        public static String objectToString (Object object, String attributePre, boolean initcap)
        {
            return objectToString (object, attributePre, null, initcap);
        }

        /**
         * 将去掉属性的前缀的xml字符串还原对象,xml中含有类的包名称
         *
         * @param xmlString
         * @param initcap 是否首字母大写 true:即首字母大写
         * @return
         */
        public static Object stringToObject (String xmlString, String attributePre, boolean initcap)
        {
            return stringToObject (xmlString,attributePre,null,true);
        }

        /**
         * 将对象转换xml字符串,将类的全路径名称简化为类简单名称
         *
         * @param object
         * @param classes
         * @return
         */
        public static String objectToString (Object object, Class < ? >[] classes)
        {
            return objectToString (object, "", classes);
        }

        /**
         * 将xml字符串转换为对象,字符串中类的名称为简化后的简单名称。
         *
         * @param xmlString
         * @param classes
         * @return
         */
        public static Object stringToObject (String xmlString, Class < ? >[] classes)
        {
            return stringToObject (xmlString, "", classes);
        }

        /**
         * 对象转换xml字符串,将属性前缀和类的包名去掉
         *
         * @param object
         * @param attributePre
         * @param classes
         * @return
         */
        public static String objectToString (Object object, String attributePre, Class < ? >[] classes)
        {
            return objectToString (object, attributePre, classes, true);
        }

        /**
         * 将去掉前缀属性前缀和类包名的xml字符串还原对象
         *
         * @param xmlString
         * @param classes
         * @param attributePre
         * @return
         */
        public static Object stringToObject (String xmlString, String attributePre, Class < ? >[] classes)
        {
            return stringToObject (xmlString, attributePre, classes, true);
        }

        /**
         * 对象转换xml字符串,将属性前缀和类的包名去掉,是否首字母大写。
         *
         * @param object
         * @param attributePre 是否去除属性前缀
         * @param classes 传递的calss结合
         * @param initcap 是否首字母大写 true:即首字母大写
         * @return
         */
        public static String objectToString (Object object, String attributePre, Class < ? >[] classes, boolean initcap)
        {
            s_logger.debug ("enter method objectToString Object={},attributePre={},classes={},initcap={}",
                            new Object[]{object,attributePre,classes,initcap});
            XStream xstream = getXmlStream ();
            List <Class < ? >> classList = new ArrayList <Class < ? >> ();
            // 无需将class的类名简写
            if (classes == null || classes.length == 0)
            {
                String xml = objectToString (xstream, object);
                if (xml == null)
                {
                    return null;
                }
                classList = getClassListFromXml (xml);
            }
            else
            {
                // 需要将类的名称简写
                setClassesAlias (xstream, classes);
                for (Class < ? > class1 : classes)
                {
                    classList.add (class1);
                }
            }

            for (Class < ? > class1 : classList)
            {
                List <String> fields = getClassField (class1);
                setFieldesAlias (xstream, class1, fields, attributePre, initcap);
            }
            return objectToString (xstream, object);
        }

        /**
         * 将去掉前缀属性前缀和类包名的xml字符串还原对象.是否首字母大写
         *
         * @param xmlString
         * @param classes
         * @param attributePre
         * @param initcap 是否首字母大写。true 即首字母大写
         * @return
         */
        public static Object stringToObject (String xmlString, String attributePre, Class < ? >[] classes, boolean initcap)
        {
            XStream xstream = getXmlStream ();
            List <Class < ? >> classList = new ArrayList <Class < ? >> ();
            // 无需将class的类名简写
            if (classes == null || classes.length == 0)
            {
                classList = getClassListFromXml (xmlString);
            }
            else
            {
                // 需要将类的名称简写
                setClassesAlias (xstream, classes);
                for (Class < ? > class1 : classes)
                {
                    classList.add (class1);
                }
            }
            for (Class < ? > class1 : classList)
            {
                List <String> fields = getClassField (class1);
                setFieldesAlias (xstream, class1, fields, attributePre, initcap);
            }
            return stringToObject (xstream, xmlString);
        }

        /**
         * 对象转换为json字符串,包含类包名和属性的前缀。
         *
         * @param object
         * @return
         */
        public static String objectToJson (Object object)
        {
            XStream xstream = getJsonStream ();
            return objectToString (xstream, object);
        }

        /**
         * 将包含类包名称,属性前缀的json字符串转换为对象。
         *
         * @param jsonXml
         * @return
         */
        public static Object jsonToObject (String jsonXml)
        {
            XStream xstream = getJsonStream ();
            return stringToObject (xstream, jsonXml);
        }

        /**
         * 将类转换为json字符串,并将类属性的前缀去掉。类包含类的全路劲信息
         *
         * @param object
         * @param attributePre
         * @return
         */
        public static String objectToJson (Object object, String attributePre)
        {
            XStream xstream = new XStream ();
            String result = xstream.toXML (object);
            List <Class < ? >> classList = getClassListFromXml (result);
            xstream = getJsonStream ();
            for (Class < ? > c : classList)
            {
                List <String> fieldList = getClassField (c);
                setFieldesAlias (xstream, c, fieldList, attributePre, false);
            }
            return objectToString (xstream, object);
        }

        /**
         * 将去掉属性的前缀的json字符串还原对象,json中类包含类的全路劲信息
         *
         * @param jsonString
         * @return
         */
        public static Object jsonToObject (String jsonString, String attributePre)
        {
            XStream xstream = getJsonStream ();
            List <Class < ? >> classList = getClassListFromJson (jsonString);
            for (Class < ? > c : classList)
            {
                List <String> fieldList = getClassField (c);
                setFieldesAlias (xstream, c, fieldList, attributePre, false);
            }
            return stringToObject (xstream, jsonString);
        }

        /**
         * 将对象转换为Json的字符串,并且将对象的类包名和属性前缀去掉。
         *
         * @param jsonString
         * @param attributePre
         * @param classes
         * @return
         */
        public static String objectToJson (Object object, String attributePre, Class < ? >[] classes)
        {
            XStream xstream = getJsonStream ();
            setClassesAlias (xstream, classes);
            for (Class < ? > class1 : classes)
            {
                List <String> fields = getClassField (class1);
                setFieldesAlias (xstream, class1, fields, attributePre, false);
            }
            return objectToString (xstream, object);
        }

        /**
         * 将去掉类包路劲信息,和属性前缀的Json,还原对象。
         *
         * @param jsonString
         * @param attributePre
         * @param classes
         * @return
         */
        public static Object jsonToObject (String jsonString, String attributePre, Class < ? >[] classes)
        {
            XStream xstream = getJsonStream ();
            setClassesAlias (xstream, classes);
            for (Class < ? > class1 : classes)
            {
                List <String> fields = getClassField (class1);
                setFieldesAlias (xstream, class1, fields, attributePre, false);
            }
            return stringToObject (xstream, jsonString);
        }

        /**
         * 将json对象转换字符串,将类的全路径名称简化为类简单名称
         *
         * @param object
         * @param classes
         * @return
         */
        public static String objectToJson (Object object, Class < ? >[] classes)
        {
            XStream xstream = getJsonStream ();
            setClassesAlias (xstream, classes);
            return objectToString (xstream, object);
        }

        /**
         * 将json字符串转换为对象,字符串中类的名称为简化后的简单名称。
         *
         * @param xmlString
         * @param classes
         * @return
         */
        public static Object jsonToObject (String xmlString, Class < ? >[] classes)
        {
            XStream xstream = getJsonStream ();
            setClassesAlias (xstream, classes);
            return stringToObject (xstream, xmlString);
        }

       
       
       
        /**
         * xstream设置类的别名为简单名称。
         *
         * @param xstream
         * @param classes
         */
        private static void setClassesAlias (XStream xstream, Class < ? >[] classes)
        {
            if (ArrayUtils.isEmpty (classes))
            {
                return;
            }
            for (Class < ? > class1 : classes)
            {
                xstream.alias (class1.getSimpleName (), class1);
            }
        }

        /**
         * 将属性的前缀去掉。例如Class A 有属性 m_name,前缀为m_,则替换A属性m_nane为name<br>
         *
         * @param xstream
         * @param c
         * @param fieldes
         * @param fieldPre
         * @param initcap 是否首字母大写
         */
        private static void setFieldesAlias (XStream xstream, Class < ? > c, List <String> fields, String fieldPre,
                                             boolean initcap)
        {
            if (CollectionUtils.isEmpty (fields))
            {
                return;
            }
            if (c == null)
            {
                return;
            }
            for (String fieldName : fields)
            {
                if (StringUtils.isBlank (fieldName))
                {
                    continue;
                }
                String alias = fieldName;
                int index = fieldName.indexOf (fieldPre);
                if (index > -1)
                {
                    alias = fieldName.substring (index + fieldPre.length ());
                }
                if (initcap)
                {
                    alias = StringUtils.capitalize (alias);
                }
                xstream.aliasField (alias, c, fieldName);
            }
        }

        /**
         * 获取类的属性名称结合
         *
         * @param c
         * @return
         */
        private static List <String> getClassField (Class < ? > c)
        {
            Field[] fields = c.getDeclaredFields ();
            List <String> result = new ArrayList <String> ();
            if (ArrayUtils.isEmpty (fields))
            {
                return result;
            }
            for (int i = 0; i < fields.length; i++)
            {
                result.add (fields.getName ());
            }
            Class < ? > superClass = c.getSuperclass ();
            if (!superClass.equals (Object.class))
            {
                result.addAll (getClassField (superClass));
            }
            return result;
        }

        /**
         * 解析xml字符串获取字符串中包含的class信息
         *
         * @param xmlString
         * @return
         */
        private static List <Class < ? >> getClassListFromXml (String xmlString)
        {
            s_logger.debug ("从xmlString解析类的结合信息:" + xmlString);
            List <Class < ? >> result = new ArrayList <Class < ? >> ();
            String[] strArray = xmlString.split ("\r*\n");
            String regex = "^ *<.*>$";
            for (String string : strArray)
            {
                if (!string.matches (regex))
                {
                    continue;
                }
                try
                {
                    Class < ? > c = Class.forName (string.replaceAll ("<|>", "").trim ());
                    if (result.indexOf (c) == -1)
                    {
                        result.add (c);
                    }
                }
                catch (Exception e)
                {
                    s_logger.debug (e.getLocalizedMessage ());
                }
            }
            s_logger.debug ("获取类集合为:" + ArrayUtils.toString (result.toArray ()));
            return result;
        }

        /**
         * 解析json字符串获取字符串中包含的class信息
         *
         * @param xmlString
         * @return
         */
        private static List <Class < ? >> getClassListFromJson (String jsonString)
        {
            s_logger.debug ("从jsonString解析类的结合信息:" + jsonString);
            List <Class < ? >> result = new ArrayList <Class < ? >> ();
            Set <String> keySet = jsonToKeySet (jsonString);
            if (CollectionUtils.isEmpty (keySet))
            {
                return result;
            }
            // 正则匹配xxxx.xxxxx.xxxxx
            String regex = "^.*(\\..*)+$";
            try
            {
                for (Iterator <String> iterator = keySet.iterator (); iterator.hasNext ();)
                {
                    String key = (String) iterator.next ();
                    if (!key.matches (regex))
                    {
                        continue;
                    }
                    Class < ? > c = Class.forName (key.trim ());
                    if (result.indexOf (c) == -1)
                    {
                        result.add (c);
                    }
                }
            }
            catch (Exception e)
            {
                e.printStackTrace ();
            }
            s_logger.debug ("获取类集合为:" + ArrayUtils.toString (result.toArray ()));
            return result;
        }

        private static Set <String> jsonToKeySet (String jsonString)
        {
            Set <String> set = new HashSet <String> ();
            if (!(jsonString.startsWith ("{") && jsonString.endsWith ("}")))
            {
                return set;
            }
            try
            {
                JSONObject obj = new JSONObject (jsonString);
                for (Iterator < ? > iterator = obj.keys (); iterator.hasNext ();)
                {
                    String key = (String) iterator.next ();
                    String value = obj.getString (key);
                    set.add (key);
                    set.addAll (jsonToKeySet (value));
                }
            }
            catch (Exception e)
            {
                e.printStackTrace ();
            }

            return set;
        }

        private static XStream getXmlStream ()
        {
            XStream xstream = new XStream ();
            xstream.setMode (XStream.NO_REFERENCES);// 不设置引用
            xstream.registerConverter (DEFAULTCONVERTER);// 注册时间转换器
            return xstream;
        }

        private static XStream getJsonStream ()
        {
            XStream xstream = new XStream (new JettisonMappedXmlDriver ());
            xstream.setMode (XStream.NO_REFERENCES);// 不设置引用
            xstream.registerConverter (DEFAULTCONVERTER);// 注册时间转换器
            return xstream;
        }

        private static String objectToString (XStream xstream, Object object)
        {
            try
            {
                String result = xstream.toXML (object);
                return result;
            }
            catch (Exception e)
            {
                s_logger.error ("xstream转换对象为xml或json错误" + object + SystemUtils.LINE_SEPARATOR + e.getMessage ());
                return null;
            }
        }

        private static Object stringToObject (XStream xstream, String xmlString)
        {
            try
            {
                Object object = xstream.fromXML (xmlString);
                return object;
            }
            catch (Exception e)
            {
                s_logger.error ("xstream转换xml或json为对象错误" + xmlString + SystemUtils.LINE_SEPARATOR + e.getMessage ());
                return null;
            }
        }

        /** 日志记录器. */
        private static Logger s_logger = LoggerFactory.getLogger (FcXStreamUtil.class);

    }


  • TA的每日心情
    难过
    2015-6-23 12:29
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-6-5 18:23:38 | 显示全部楼层
    好多例子呀,谢谢
  • TA的每日心情
    开心
    2015-3-4 12:40
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2015-6-6 16:31:31 | 显示全部楼层
    林姑娘 发表于 2015-6-5 18:23
    好多例子呀,谢谢

    哈哈 对林姑娘的工作大有裨益哦
    您需要登录后才可以回帖 登录 | 注册青鸟豆号

    本版积分规则

    Copyright 1999-2019 Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd

    北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有

    京ICP备11045574号-3 京公网安备11010802013845号

    快速回复 返回顶部 返回列表