欢迎来到 IT实训基地-南通科迅教育
咨询电话:0513-81107100
自定义实现Json字符串向C#对象的转变
2017/2/11
科迅教育
445
南通Web前端培训学校,南通Web前端培训收费,南通Web前端培训学费是多少
这里使用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!", type));  
            }  
  
            return parseMethod.Invoke(null, new object[] { value });  
        }  
    }  
}  
 
最后这是用于测试的代码
[csharp]  
public class Message  
    {  
        //{ "result": 100, "response": "Who are you?!", "id": 13185569, "msg": "OK." }  
  
        [JsonField(Name = "result")]  
        public int Result { get; set; }  
  
        [JsonField(Name = "response")]  
        public string Response { get; set; }  
  
        [JsonField(Name = "id")]  
        public int Id { get; set; }  
  
        [JsonField(Name = "msg")]  
        public string Msg { get; set; }  
    }  www.2cto.com
[csharp]  
class Program  
    {  
        static void Main(string[] args)  
        {  
            JsonToInstance util = new JsonToInstance();  
            string json = "\"response\":\"我是阿猫酱的小黄鸡\",\"id\":21231513,\"result\":100,\"msg\":\"OK.\"";  
            Message m = util.ToInstance<Message>(json);  
        }  
    }
77
关闭
先学习,后交费申请表
每期5位名额
在线咨询
免费电话
QQ联系
先学习,后交费
TOP
您好,您想咨询哪门课程呢?
关于我们
机构简介
官方资讯
地理位置
联系我们
0513-91107100
周一至周六     8:30-21:00
微信扫我送教程
手机端访问
南通科迅教育信息咨询有限公司     苏ICP备15009282号     联系地址:江苏省南通市人民中路23-6号新亚大厦三楼             法律顾问:江苏瑞慈律师事务所     Copyright 2008-