这是 WEB 前后端数据接口交互常用的程序,基本思路是使用 .NET Framework 提供的 JavaScriptSerializer 类进行序列化和反序列化操作,需要引用 .NET Framework 中的 System.Web.Extensions 程序集。
需要注意对于 DataTable 类型的转换会出现 “序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用” 这一异常,所以程序中对 DataTable 类型的转换作了单独处理,当然只是从 DataTable 转换为 JSON 时作了处理,如果将 JSON 字符串转换为 DataTable 依然会失败,不过实际项目中可能基本不存在这种操作,代码如下:
using System;
using System.Web.Script.Serialization;
using System.Data;
using System.Collections.Generic;
// 对象转换为 JSON 字符串
string ObjectToJSON(object _obj)
{
try
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
if (_obj is DataTable)
{
DataTable dt = (DataTable)_obj;
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
row.Add(dc.ColumnName, dr[dc]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
return serializer.Serialize(_obj);
}
catch
{
return "{}";
}
}
// JSON 字符串转换为相应类型的对象
T JSONToObject<T>(string _json)
{
try
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<T>(_json);
}
catch
{
return default(T);
}
}
对于涉及 DataTable 类型的数据,建议再参考如下单独处理的方法:
// DataTable 转键值集合,多条数据使用
public List<Dictionary<string, string>> DataTableToListDictionary(DataTable dt)
{
List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
for (int i = 0; i < dr.Table.Columns.Count; i++)
{
dic.Add(dr.Table.Columns[i].ColumnName.ToString(), dr[dr.Table.Columns[i].ColumnName].ToString());
}
result.Add(dic);
}
}
return result;
}
// DataTable 转键值,单条数据使用
public Dictionary<string, object> DataTableToDictionary(DataTable dataTable)
{
Dictionary<string, object> result = new Dictionary<string, object>();
if (dataTable != null)
{
foreach (DataRow dataRow in dataTable.Rows)
{
foreach (DataColumn dataColumn in dataTable.Columns)
{
result.Add(dataColumn.ColumnName, dataRow[dataColumn].ToString());
}
}
}
else
{
result = null;
}
return result;
}
相关环境:.NET Framework 4.0