当前位置:编程学习 > JS >>

自定义实现Json字符串向C#对象的转变

这里使用Atrribute的方式实现了Json字符串向C#对象的转变。因为功能局限,此版本只是针对于Json字符串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json数组。这里的Atrribute是作用在属性上,像NHibernate中的Atrribute一样,是在运行时通过反射来获取这个属性对应于Json字符串中的哪个key.
[csharp]  
namespace JsonMapper  
{  
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]  
    public class JsonFieldAttribute : Attribute  
    {  
        private string _Name = string.Empty;  
  
        public string Name  
        {  
            get { return _Name; }  
            set { _Name = value; }  
        }  
    }  
}  
接下来是这个转换工具中的核心代码,主要是分解并且分析Json字符串中key与value, 并且通过反射获得对象中的各个对应属性并且赋值。
[csharp] 
namespace JsonMapper  
{  
    public class JsonToInstance  
    {  
        public T ToInstance<T>(string json) where T : new()  
        {  
            Dictionary<string, string> dic = new Dictionary<string, string>();  
            string[] fields = json.Split(',');  
            for (int i = 0; i < fields.Length; i++ )  
            {  
                string[] keyvalue = fields[i].Split(':');  
                dic.Add(Filter(keyvalue[0]), Filter(keyvalue[1]));  
            }  
  
            PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);  
  
            T entity = new T();  
            foreach (PropertyInfo property in properties)  
            {  
                object[] propertyAttrs = property.GetCustomAttributes(false);  
                for (int i = 0; i < propertyAttrs.Length; i++)   
                {  
                    object propertyAttr = propertyAttrs[i];  
                    if (propertyAttr is JsonFieldAttribute)  
                    {  
                        JsonFieldAttribute jsonFieldAttribute = propertyAttr as JsonFieldAttribute;  
                        foreach (KeyValuePair<string ,string> item in dic)  
                        {  
                            if (item.Key == jsonFieldAttribute.Name)  
                            {  
                                Type t = property.PropertyType;  
                                property.SetValue(entity, ToType(t, item.Value), null);  
                                break;  
                            }  
                        }  
                    }  
                }  
            }  
            return entity;  
        }  
  
        private string Filter(string str)  
        {  
            if (!(str.StartsWith("\"") && str.EndsWith("\"")))  
            {  
                return str;  
            }  
            else   
            {  
                return str.Substring(1, str.Length - 2);  
            }  
        }  
  
        public object ToType(Type type, string value)  
        {  
            if (type == typeof(string))  
            {  
                return value;  
            }  
  
            MethodInfo parseMethod = null;  
  
            foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static   
                | BindingFlags.Public))  
            {  
                if (mi.Name == "Parse" && mi.GetParameters().Length == 1)  
                {  
                    parseMethod = mi;  
                    break;  
                }  
            }  
  
            if (parseMethod == null)  
            {  
                throw new ArgumentException(string.Format(  
                    "Type: {0} has not Parse static method!",
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,