程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 自定義實現Json字符串向C#對象的轉變

自定義實現Json字符串向C#對象的轉變

編輯: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!", 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);           }       }      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved