源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#实现简单的JSON序列化功能代码实例

  • 时间:2021-08-23 11:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#实现简单的JSON序列化功能代码实例
 好久没有做web了,JSON目前比较流行,闲得没事,所以动手试试将对象序列化为JSON字符(尽管DotNet Framework已经有现成的库,也有比较好的第三方开源库),而且只是实现了处理简单的类型,并且DateTime处理的也不专业,有兴趣的筒子可以扩展,代码比较简单,反序列化木有实现:( ,直接贴代码吧,都有注释了,所以废话不多说  :)
[u]复制代码[/u] 代码如下:
测试类/// <summary>     /// Nested class of Person.     /// </summary>     public class House     {         public string Name         {             get;             set;         }         public double Price         {             get;             set;         }     }     /// <summary>     /// Person dummy class     /// </summary>     public class Person     {         public string Name         {             get;             set;         }         public int Age         {             get;             set;         }         public string Address         {             get;             set;         }         private int h = 12;         public bool IsMarried         {             get;             set;         }         public string[] Names         {             get;             set;         }         public int[] Ages         {             get;             set;         }         public House MyHouse         {             get;             set;         }         public DateTime BirthDay         {             get;             set;         }         public List<string> Friends         {             get;             set;         }         public List<int> LoveNumbers         {             get;             set;         }     }
[u]复制代码[/u] 代码如下:
接口定义  /// <summary>     /// IJsonSerializer interface.     /// </summary>     interface IJsonSerializer     {         /// <summary>         /// Serialize object to json string.         /// </summary>         /// <typeparam name="T">The type to be serialized.</typeparam>         /// <param name="obj">Instance of the type T.</param>         /// <returns>json string.</returns>         string Serialize(object obj);         /// <summary>         /// Deserialize json string to object.         /// </summary>         /// <typeparam name="T">The type to be deserialized.</typeparam>         /// <param name="jsonString">json string.</param>         /// <returns>instance of type T.</returns>         T Deserialize<T>(string jsonString);     }
接口实现,还有待完善..
[u]复制代码[/u] 代码如下:
/// <summary>     /// Implement IJsonSerializer, but Deserialize had not been implemented.     /// </summary>     public class JsonSerializer : IJsonSerializer     {         /// <summary>         /// Serialize object to json string.         /// </summary>         /// <typeparam name="T">The type to be serialized.</typeparam>         /// <param name="obj">Instance of the type T.</param>         /// <returns>json string.</returns>         public string Serialize(object obj)         {             if (obj == null)             {                 return "{}";             }             // Get the type of obj.             Type t = obj.GetType();             // Just deal with the public instance properties. others ignored.             BindingFlags bf = BindingFlags.Instance | BindingFlags.Public;             PropertyInfo[] pis = t.GetProperties(bf);             StringBuilder json = new StringBuilder("{");             if (pis != null && pis.Length > 0)             {                 int i = 0;                 int lastIndex = pis.Length - 1;                 foreach (PropertyInfo p in pis)                 {                     // Simple string                     if (p.PropertyType.Equals(typeof(string)))                     {                         json.AppendFormat("\"{0}\":\"{1}\"", p.Name, p.GetValue(obj, null));                     }                     // Number,boolean.                     else if (p.PropertyType.Equals(typeof(int)) ||                         p.PropertyType.Equals(typeof(bool)) ||                         p.PropertyType.Equals(typeof(double)) ||                         p.PropertyType.Equals(typeof(decimal))                         )                     {                         json.AppendFormat("\"{0}\":{1}", p.Name, p.GetValue(obj, null).ToString().ToLower());                     }                     // Array.                     else if (isArrayType(p.PropertyType))                     {                         // Array case.                         object o = p.GetValue(obj, null);                         if (o == null)                         {                             json.AppendFormat("\"{0}\":{1}", p.Name, "null");                         }                         else                         {                             json.AppendFormat("\"{0}\":{1}", p.Name, getArrayValue((Array)p.GetValue(obj, null)));                         }                     }                     // Class type. custom class, list collections and so forth.                     else if (isCustomClassType(p.PropertyType))                     {                         object v = p.GetValue(obj, null);                         if (v is IList)                         {                             IList il = v as IList;                             string subJsString = getIListValue(il);                             json.AppendFormat("\"{0}\":{1}", p.Name, subJsString);                         }                         else                         {                             // Normal class type.                             string subJsString = Serialize(p.GetValue(obj, null));                             json.AppendFormat("\"{0}\":{1}", p.Name, subJsString);                         }                     }                     // Datetime                     else if (p.PropertyType.Equals(typeof(DateTime)))                     {                         DateTime dt = (DateTime)p.GetValue(obj, null);                         if (dt == default(DateTime))                         {                             json.AppendFormat("\"{0}\":\"\"", p.Name);                         }                         else                         {                             json.AppendFormat("\"{0}\":\"{1}\"", p.Name, ((DateTime)p.GetValue(obj, null)).ToString("yyyy-MM-dd HH:mm:ss"));                         }                     }                     else                     {                         // TODO: extend.                     }                     if (i >= 0 && i != lastIndex)                     {                         json.Append(",");                     }                     ++i;                 }             }             json.Append("}");             return json.ToString();         }         /// <summary>         /// Deserialize json string to object.         /// </summary>         /// <typeparam name="T">The type to be deserialized.</typeparam>         /// <param name="jsonString">json string.</param>         /// <returns>instance of type T.</returns>         public T Deserialize<T>(string jsonString)         {             throw new NotImplementedException("Not implemented :(");         }         /// <summary>         /// Get array json format string value.         /// </summary>         /// <param name="obj">array object</param>         /// <returns>js format array string.</returns>         string getArrayValue(Array obj)         {             if (obj != null)             {                 if (obj.Length == 0)                 {                     return "[]";                 }                 object firstElement = obj.GetValue(0);                 Type et = firstElement.GetType();                 bool quotable = et == typeof(string);                 StringBuilder sb = new StringBuilder("[");                 int index = 0;                 int lastIndex = obj.Length - 1;                 if (quotable)                 {                     foreach (var item in obj)                     {                         sb.AppendFormat("\"{0}\"", item.ToString());                         if (index >= 0 && index != lastIndex)                         {                             sb.Append(",");                         }                         ++index;                     }                 }                 else                 {                     foreach (var item in obj)                     {                         sb.Append(item.ToString());                         if (index >= 0 && index != lastIndex)                         {                             sb.Append(",");                         }                         ++index;                     }                 }                 sb.Append("]");                 return sb.ToString();             }             return "null";         }         /// <summary>         /// Get Ilist json format string value.         /// </summary>         /// <param name="obj">IList object</param>         /// <returns>js format IList string.</returns>         string getIListValue(IList obj)         {             if (obj != null)             {                 if (obj.Count == 0)                 {                     return "[]";                 }                 object firstElement = obj[0];                 Type et = firstElement.GetType();                 bool quotable = et == typeof(string);                 StringBuilder sb = new StringBuilder("[");                 int index = 0;                 int lastIndex = obj.Count - 1;                 if (quotable)                 {                     foreach (var item in obj)                     {                         sb.AppendFormat("\"{0}\"", item.ToString());                         if (index >= 0 && index != lastIndex)                         {                             sb.Append(",");                         }                         ++index;                     }                 }                 else                 {                     foreach (var item in obj)                     {                         sb.Append(item.ToString());                         if (index >= 0 && index != lastIndex)                         {                             sb.Append(",");                         }                         ++index;                     }                 }                 sb.Append("]");                 return sb.ToString();             }             return "null";         }         /// <summary>         /// Check whether t is array type.         /// </summary>         /// <param name="t"></param>         /// <returns></returns>         bool isArrayType(Type t)         {             if (t != null)             {                 return t.IsArray;             }             return false;         }         /// <summary>         /// Check whether t is custom class type.         /// </summary>         /// <param name="t"></param>         /// <returns></returns>         bool isCustomClassType(Type t)         {             if (t != null)             {                 return t.IsClass && t != typeof(string);             }             return false;         }     }
测试代码:
[u]复制代码[/u] 代码如下:
class Program     {         static void Main(string[] args)         {             Person ps = new Person()             {                 Name = "Leon",                 Age = 25,                 Address = "China",                 IsMarried = false,                 Names = new string[] { "wgc", "leon", "giantfish" },                 Ages = new int[] { 1, 2, 3, 4 },                 MyHouse = new House()                 {                     Name = "HouseName",                     Price = 100.01,                 },                 BirthDay = new DateTime(1986, 12, 20, 12, 12, 10),                 Friends = new List<string>() { "friend1", "friend2" },                 LoveNumbers = new List<int>() { 1, 2, 3 }             };             IJsonSerializer js = new JsonSerializer();             string s = js.Serialize(ps);             Console.WriteLine(s);             Console.ReadKey();         }     }
 生成的 JSON字符串 :  
[u]复制代码[/u] 代码如下:
 {"Name":"Leon","Age":25,"Address":"China","IsMarried":false,"Names":["wgc","leon","giantfish"],"Ages":[1,2,3,4],"MyHouse":{"Name":"HouseName","Price":100.01},"BirthDay":"1986-12-20 12:12:10","Friends":["friend1","friend2"],"LoveNumbers":[1,2,3]}  
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部