一、需求场景
(1)不能用JavaScriptSerializer、DataContractJsonSerializer、Newtonsoft.Json这些写好的方法,需要自己写方法。
(2)转化的类的字段名称是固定不变的。
二、具体实现
(1)先定义好需要的两个类,Order(订单)和Good(商品)
1 /// <summary> 2 /// 订单 3 /// </summary> 4 public class Order 5 { 6 7 public Order() 8 { 9 this.Goods = new List<Good>(); 10 } 11 /// <summary> 12 /// 订单号 13 /// </summary> 14 public string OrderNumber { get; set; } 15 /// <summary> 16 /// 总价格 17 /// </summary> 18 public double SumPrice { get; set; } 19 20 /// <summary> 21 /// 创建时间 22 /// </summary> 23 public DateTime CreateTime { get; set; } 24 25 public List<Good> Goods { get; set; } 26 } 27 28 /// <summary> 29 /// 商品 30 /// </summary> 31 public class Good 32 { 33 /// <summary> 34 /// 名称 35 /// </summary> 36 public string Name { get; set; } 37 38 /// <summary> 39 /// 价格 40 /// </summary> 41 public double Price { get; set; } 42 }
(2)实例化order并进行赋值
1 #region 初始化myOrder 2 Order myOrder = new Order 3 { 4 OrderNumber = "test521", 5 SumPrice = 80.3, 6 CreateTime = DateTime.Now 7 }; 8 myOrder.Goods = new List<Good>(); 9 10 Good goodOne = new Good 11 { 12 Name="明朝那些事", 13 Price=50.3 14 }; 15 myOrder.Goods.Add(goodOne); 16 17 18 Good goodTwo = new Good 19 { 20 Name = "简单逻辑学", 21 Price = 30 22 }; 23 myOrder.Goods.Add(goodTwo); 24 #endregion
(3)将myOder对象转化为Json字符串(需引入命名空间:System.Reflection)
1 #region 将对象转换为json 2 IList<Dictionary<string, object>> ld = new List<Dictionary<string, object>>(); 3 //先把Name和Code放进去 4 StringBuilder jsonStr = new StringBuilder(); 5 string attrName = ""; 6 jsonStr.Append("{"); 7 foreach (System.Reflection.PropertyInfo p in myOrder.GetType().GetProperties()) 8 { 9 var name = p.Name; 10 //判断是否是泛型 11 if ((p.PropertyType.IsGenericType)) 12 { 13 PropertyInfo[] props = typeof(Good).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 14 jsonStr.Append(""Goods":"); 15 jsonStr.Append("["); 16 17 for (int i = 0; i < myOrder.Goods.Count; i++) 18 { 19 jsonStr.Append("{"); 20 foreach (PropertyInfo property in props) 21 { 22 //如果是double类型,则属性值不需要加引号 23 if (property.PropertyType.Name == "Double") 24 { 25 jsonStr.Append(""" + property.Name + "":" + property.GetValue(myOrder.Goods[i], property.GetIndexParameters()) + ""); 26 } 27 else 28 { 29 jsonStr.Append(""" + property.Name + "":"" + property.GetValue(myOrder.Goods[i], property.GetIndexParameters()) + """); 30 } 31 32 //jsonStr.Append("}"); 33 //如果不是最后一个 34 if (property != props[props.Length - 1]) 35 { 36 jsonStr.Append(","); 37 } 38 } 39 40 //如果不是最后一个元素,需要加上逗号 41 jsonStr.Append("}"); 42 if (i != myOrder.Goods.Count - 1) 43 { 44 jsonStr.Append(","); 45 } 46 } 47 jsonStr.Append("]"); 48 } 49 else 50 { 51 attrName = p.Name; 52 object o = p.GetValue(myOrder, null); 53 //如果是double类型,则属性值不需要加引号 54 if (p.PropertyType.Name == "Double") 55 { 56 jsonStr.Append(""" + attrName + "":" + o.ToString() + ","); 57 } 58 else 59 { 60 jsonStr.Append(""" + attrName + "":"" + o.ToString() + "","); 61 } 62 } 63 } 64 jsonStr.Append("}"); 65 string str = jsonStr.ToString(); 66 #endregion
(4)效果
写在后面的话:该方法只对于文中的数据类型有用,稍微变化顺序,转出来的数据就不符合要求,适应力不强。