c#将json转换为dynamic对象 (推荐)

来源:互联网 发布:java最新商城源码 编辑:程序博客网 时间:2024/06/05 21:12

来自:http://outofmemory.cn/code-snippet/1246/c-jiang-json-switch-dynamic-object

DynamicJsonConverter类如下:

using System;using System.Collections;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Dynamic;using System.Linq;using System.Text;using System.Web.Script.Serialization;private sealed 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}

用法如下:

string json = ...;var serializer = new JavaScriptSerializer();serializer.RegisterConverters(new[] { new DynamicJsonConverter() });dynamic obj = serializer.Deserialize(json, typeof(object));

例如给定的字符串如下:

{  "Items":[    { "Name":"Apple", "Price":12.3 },    { "Name":"Grape", "Price":3.21 }  ],  "Date":"21/11/2010"}
执行结果:

var data = serializer.Deserialize(json, typeof(object));data.Date; // "21/11/2010"data.Items.Count; // 2data.Items[0].Name; // "Apple"data.Items[0].Price; // 12.3 (as a decimal)data.Items[1].Name; // "Grape"data.Items[1].Price; // 3.21 (as a decimal)




原创粉丝点击