基于Reflect将List泛型数据源转换为Json字符串

Posted 大木水可

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Reflect将List泛型数据源转换为Json字符串相关的知识,希望对你有一定的参考价值。

在Web开发中,较为常用的数据传递格式为json键值对字符串格式,而在普遍的ORM全映射或半映射技术中,从后端所获得的数据往往是Enumerable或是List<T>类型的数据,因此做了一个通用类,实现将List<T>类型的数据向json格式数据的转换。代码如下:

首先建立一个基于Reflect的基础类Reflect,实现对名称为给定字符串的属性的赋值或取值操作:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Collections;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Reflection;
 7 
 8 namespace ReflectionLearning
 9 {
10     class Reflect
11     {
12         private Type _type;
13         private object _obj;
14         private PropertyInfo _propertyInfo;
15 
16         public Reflect(object obj)
17         {
18             this._obj = obj;
19             _type = obj.GetType();            
20         }
21 
22         /// <summary>
23         /// 通过反射,传入属性名,获取属性值
24         /// </summary>
25         /// <param name="Name"></param>
26         /// <returns></returns>
27         public object GetValue(string Name)
28         {
29             _propertyInfo = _type.GetProperty(Name);
30             object result = _propertyInfo.GetValue(_obj, null);
31             return result;
32         }
33 
34         /// <summary>
35         /// 传入属性名、属性值,完成属性赋值操作
36         /// </summary>
37         /// <param name="Name"></param>
38         /// <param name="value"></param>
39         public void SetValue(string Name, object value)
40         {
41             _propertyInfo = _type.GetProperty(Name);
42             _propertyInfo.SetValue(_obj,value, null);
43         }
44     }
45 }

 

在通用类中,对Reflect类进行引用,然后通过遍历List<T>中的每个T类的每个属性,进行键值对的转换:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Data;
 5 using System.Text;
 6 
 7 namespace ReflectionLearning
 8 {
 9     class ValueTurning
10     {
11         private Reflect reflect;
12         private string[] parms;
13         private DataTable dt;
14         private List<Type> ResultList;
15 
16         //以数据源Dt,属性列表Parms,原始列表(其中元素已定义但未实例化)outList
17         //对此类进行初始化操作
18         public ValueTurning(DataTable Dt, string[] Parms, List<Type> outList)
19         {
20             dt = Dt;
21             parms = Parms;
22             ResultList = outList;
23             beginTurning();
24             GetJsonFromList(ResultList);
25         }
26 
27         /// <summary>
28         /// 遍历List中的元素,以Dt中的查询结果对其属性赋值
29         /// </summary>
30         public void beginTurning()
31         {
32             object obj;
33             //遍历List中的每一个元素
34             for (int i = 0; i < dt.Rows.Count; i++)
35             {
36                 //访问当前元素,用以初始化reflect反射类
37                 obj = ResultList[i];
38                 reflect = new Reflect(obj);
39 
40                 //遍历此元素中的每个属性,对其赋值
41                 for (int j = 0; j < parms.Length; j++)
42                 {
43                     //设置属性
44                     reflect.SetValue(parms[j], dt.Rows[i][parms[j]]);
45                 }
46 
47                 TmpReset(obj);
48             }
49         }
50 
51         /// <summary>
52         /// 以ResultList中的元素为数据源,转化为JSON字符串
53         /// </summary>
54         /// <returns>Json字符串</returns>
55         public string GetJsonFromList(List<Type> ResultList)
56         {
57             StringBuilder strBuilder = new StringBuilder();
58             if (ResultList.Count <= 0)
59             {
60                 return "";
61             }
62             else
63             {
64                 int num=ResultList.Count;
65                 int index = 0;
66                 object obj;
67                 for (; index < num; index++)
68                 {
69                     obj = ResultList[index];
70                     reflect = new Reflect(obj);
71                     string parm = parms[index];
72                     strBuilder.Append("{");
73                     strBuilder.Append(couple(parm, reflect.GetValue(parm).ToString()));
74                     strBuilder.Append("}");
75                     if (index != num - 1)
76                         strBuilder.Append(",");
77                     TmpReset(obj);
78                 }
79                 return strBuilder.ToString();
80             }
81         }
82 
83         //临时对象初始化
84         private void TmpReset(object obj)
85         {
86             obj = null;
87             reflect = null;
88         }
89 
90         //将键值对转化成 "str1":"str2" 形式
91         public string couple(string str1, string str2)
92         {
93             return ("\"" + str1 + "\":\"" + str2 + "\"");
94         }
95     }
96 }

 

以上是关于基于Reflect将List泛型数据源转换为Json字符串的主要内容,如果未能解决你的问题,请参考以下文章

Unity中基于EPPLUS的Excel转换以及Json数据读取

Java:将对象转换为泛型类型

Java工具类 - 将List转换为树状结构

GSON速学必会

Jackson将json字符串转换成泛型List

利用反射获取泛型