自訂實現Json字串向C#對象轉變的方法

來源:互聯網
上載者:User
這裡使用Atrribute的方式實現了Json字串向C#對象的轉變。因為功能局限,此版本只是針對於Json字串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json數組。這裡的Atrribute是作用在屬性上,像NHibernate中的Atrribute一樣,是在運行時通過反射來擷取這個屬性對應於Json字串中的哪個key.

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, 並且通過反射獲得對象中的各個對應屬性並且賦值。

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 });        }    }}

最後這是用於測試的代碼

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; }    }
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);        }    }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.