郭某人的网站

关于 / 留言

.NET Framework 技术分享,C# 对象与 JSON 字符串的相互转换

c# DataTable 转 JSON,任意 object 对象转 JSON 字符串方法


这是 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


最后更新时间:2023/02/17 15:01

不管我的死活了是吧,那我以后就不分享了 🙄

注意!你的赞赏转账请考虑再三后支付,此收款不作任何形式的退款。