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

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

  • 相关阅读:
    iOS9下App Store新应用提审攻略
    信息安全系统设计基础第十一周学习总结
    Linux第十一次学习笔记
    信息安全系统设计基础第十周学习总结
    Linux第八次学习笔记
    Linux第七次实验笔记
    家庭作业3.67
    Linux第六次学习笔记
    Linux第五次学习笔记
    Linux第四次学习笔记
  • 原文地址:https://www.cnblogs.com/jas0203/p/9947459.html
Copyright © 2020-2023  润新知