JSON字符串反序列化对象,对象序列化json,json转化为dynamic

来源:互联网 发布:吉翔数据 编辑:程序博客网 时间:2024/05/16 14:11
/* * json简单帮助工具类 * zhifeiya * 2015-2-2 */using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.Runtime.Serialization.Json;using System.IO;using System.Runtime.Serialization.Formatters.Binary;using System.Web.Script.Serialization;using System.Dynamic;using System.Collections;using System.Collections.ObjectModel;namespace Mvc.Util{    #region 【public】【JsonHelper】把具体的对象序列化json字符串,或者把json字符串反序列化为具体的对象    /// <summary>    /// 把具体的对象序列化json字符串,或者把json字符串反序列化为具体的对象    /// </summary>    public class JsonHelper    {        /// <summary>        /// 从一个对象信息生成Json串        /// </summary>        /// <param name="obj"></param>        /// <returns></returns>        public static string ObjectToJson(object obj)        {            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());            MemoryStream stream = new MemoryStream();            serializer.WriteObject(stream, obj);            byte[] dataBytes = new byte[stream.Length];            stream.Position = 0;            stream.Read(dataBytes, 0, (int)stream.Length);            return Encoding.UTF8.GetString(dataBytes);        }        /// <summary>        /// 从一个Json串生成对象信息        /// </summary>        /// <param name="jsonString"></param>        /// <param name="obj"></param>        /// <returns></returns>        public static object JsonToObject(string jsonString, object obj)        {            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());            MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString.Trim()));            return serializer.ReadObject(mStream);        }        /// <summary>        /// 序列化 对象到字符串        /// </summary>        /// <param name="obj">泛型对象</param>        /// <returns>序列化后的字符串</returns>        public static string Serialize<T>(T obj)        {            try            {                IFormatter formatter = new BinaryFormatter();                MemoryStream stream = new MemoryStream();                formatter.Serialize(stream, obj);                stream.Position = 0;                byte[] buffer = new byte[stream.Length];                stream.Read(buffer, 0, buffer.Length);                stream.Flush();                stream.Close();                return Convert.ToBase64String(buffer);            }            catch (Exception ex)            {                throw new Exception("序列化失败,原因:" + ex.Message);            }        }        /// <summary>        /// 反序列化 字符串到对象        /// </summary>        /// <param name="obj">泛型对象</param>        /// <param name="str">要转换为对象的字符串</param>        /// <returns>反序列化出来的对象</returns>        public static T Desrialize<T>(T obj, string str)        {            try            {                obj = default(T);                IFormatter formatter = new BinaryFormatter();                byte[] buffer = Convert.FromBase64String(str);                MemoryStream stream = new MemoryStream(buffer);                obj = (T)formatter.Deserialize(stream);                stream.Flush();                stream.Close();            }            catch (Exception ex)            {                throw new Exception("反序列化失败,原因:" + ex.Message);            }            return obj;        }    }    #endregion    #region 把json字符串转化为dynamic类型的对象    #region【public】【JsonToDynamic】把json字符串转化为dynamic类型的对象。注:为使用方便,对DynamicJsonConverter进行了包装    public class JsonToDynamic    {        public static dynamic GetDynamic(string json)        {            var serializer = new JavaScriptSerializer();            serializer.RegisterConverters(new[] { new DynamicJsonConverter() });            dynamic dy = serializer.Deserialize(json, typeof(object));            return dy;        }    }    #endregion    #region【private】【DynamicJsonConverter】 把json字符串转化为dynamic类型的对象    private class DynamicJsonConverter : JavaScriptConverter    {        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)        {            if (dictionary == null)                throw new ArgumentNullException("dictionary");            return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;        }        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)        {            throw new NotImplementedException();        }        public override IEnumerable<Type> SupportedTypes        {            get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }        }        #region Nested type: DynamicJsonObject        private sealed class DynamicJsonObject : DynamicObject        {            private readonly IDictionary<string, object> _dictionary;            public DynamicJsonObject(IDictionary<string, object> dictionary)            {                if (dictionary == null)                    throw new ArgumentNullException("dictionary");                _dictionary = dictionary;            }            public override string ToString()            {                var sb = new StringBuilder("{");                ToString(sb);                return sb.ToString();            }            private void ToString(StringBuilder sb)            {                var firstInDictionary = true;                foreach (var pair in _dictionary)                {                    if (!firstInDictionary)                        sb.Append(",");                    firstInDictionary = false;                    var value = pair.Value;                    var name = pair.Key;                    if (value is string)                    {                        sb.AppendFormat("{0}:\"{1}\"", name, value);                    }                    else if (value is IDictionary<string, object>)                    {                        new DynamicJsonObject((IDictionary<string, object>)value).ToString(sb);                    }                    else if (value is ArrayList)                    {                        sb.Append(name + ":[");                        var firstInArray = true;                        foreach (var arrayValue in (ArrayList)value)                        {                            if (!firstInArray)                                sb.Append(",");                            firstInArray = false;                            if (arrayValue is IDictionary<string, object>)                                new DynamicJsonObject((IDictionary<string, object>)arrayValue).ToString(sb);                            else if (arrayValue is string)                                sb.AppendFormat("\"{0}\"", arrayValue);                            else                                sb.AppendFormat("{0}", arrayValue);                        }                        sb.Append("]");                    }                    else                    {                        sb.AppendFormat("{0}:{1}", name, value);                    }                }                sb.Append("}");            }            public override bool TryGetMember(GetMemberBinder binder, out object result)            {                if (!_dictionary.TryGetValue(binder.Name, out result))                {                    // return null to avoid exception.  caller can check for null this way...                    result = null;                    return true;                }                var dictionary = result as IDictionary<string, object>;                if (dictionary != null)                {                    result = new DynamicJsonObject(dictionary);                    return true;                }                var arrayList = result as ArrayList;                if (arrayList != null && arrayList.Count > 0)                {                    if (arrayList[0] is IDictionary<string, object>)                        result = new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x)));                    else                        result = new List<object>(arrayList.Cast<object>());                }                return true;            }        }        #endregion    }    #endregion    #endregion}

0 0
原创粉丝点击