using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Web.Script.Serialization;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.ComponentModel;

namespace Ant.Common
{
    /// <summary>
    /// JSON,XML和实体相互转换
    /// </summary>
    public class SerializationHelper
    {

        /// <summary>
        /// 将对象根据格式(XML/JSON)序列化成字符串结果
        /// </summary>
        /// <param name="o">目标对象</param>
        /// <param name="format">输出格式</param>
        /// <returns></returns>
        public static string Serialize(object o, Format format)
        {
            return format == Format.Xml ? XmlSerialize(o) : ObjectToJson(o);
        }

        /// <summary>
        /// 将字符串根据格式(XML/JSON)反序列化成指定类型的对象
        /// </summary>
        /// <typeparam name="T">指定类型</typeparam>
        /// <param name="s">目标字符串</param>
        /// <param name="format">输入格式</param>
        /// <returns></returns>
        public static T Deserialize<T>(string s, Format format)
        {
            return format == Format.Xml ? XmlDeserial<T>(s) : JsonToObject<T>(s);
        }

        /// <summary>
        /// XML转实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(string xml)
        {

           return XmlDeserial<T>(xml);
        }



        /// <summary> 
        /// 对象转JSON
        /// </summary> 
        /// <param name="obj">对象</param> 
        /// <returns>JSON格式的字符串</returns> 
        private static string ObjectToJson(object obj)
        {
            var jss = new JavaScriptSerializer();
            try
            {
                return jss.Serialize(obj);
            }
            catch (Exception ex)
            {

                throw new Exception("JSONHelper.ObjectToJSON(): " + ex.Message);
            }
        }

        /// <summary>
        /// 实体转成XML格式
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        private static string XmlSerialize(object o)
        {
            using (var ms = new MemoryStream())
            {
                var serializer = new XmlSerializer(o.GetType());
                serializer.Serialize(ms, o);
                ms.Seek(0, SeekOrigin.Begin);
                using (var reader = new StreamReader(ms, Encoding.UTF8))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        /// <summary>
        /// JSON转实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonText"></param>
        /// <returns></returns>
        private static T JsonToObject<T>(string jsonText)
        {
            var jss = new JavaScriptSerializer();
            try
            {
                return !string.IsNullOrEmpty(jsonText) ? jss.Deserialize<T>(jsonText) : default(T);
            }
            catch (Exception ex)
            {
                throw new Exception("JSONToObject(): " + ex.Message);
            }
        }

        /// <summary>
        /// XML转实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="s"></param>
        /// <returns></returns>
        private static T XmlDeserial<T>(string s)
        {
            var xdoc = new XmlDocument();
            try
            {
                string str = "<?xml version='1.0' encoding='utf-8'?><AppSettings>" + s + "</AppSettings>";
                xdoc.LoadXml(str);
                if (xdoc.DocumentElement != null)
                {
                    var reader = new XmlNodeReader(xdoc.DocumentElement);
                    var ser = new XmlSerializer(typeof(T));
                    var obj = ser.Deserialize(reader);
                    return (T)obj;
                }
            }
            catch (Exception ex)
            {
                return default(T);
            }
            return default(T);
        }

        /// <summary>
        /// JOSN数据过滤
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string stringToJson(string s)
        {
            //Microsoft.JScript.GlobalObject.escape(strJS);
            string sb = "";
            sb=s.Replace("/", "\\/");
            sb = sb.Replace("\"", "\\\"");
            sb = sb.Replace("\b", "\\b");
            sb = sb.Replace("\f", "\\f");
            sb = sb.Replace("\n", "\\n");
            sb = sb.Replace("\r", "\\r");
            sb = sb.Replace("\t", "\\t");
            return sb;
        }

    }

    public enum Format
    {
        [Description("Xml")]
        Xml = 1,
        [Description("Json")]
        Json = 2
    }
    


}