C# 手写将对象转换为Json方法

一、需求场景

  (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)效果

 写在后面的话:该方法只对于文中的数据类型有用,稍微变化顺序,转出来的数据就不符合要求,适应力不强。

猜你喜欢

转载自www.cnblogs.com/jas0203/p/9947459.html