.NET Core中如何将DataSet序列化为JSON?
在.NET Core中序列化DataSet为JSON的解决方案
在.NET Core里完全可以把DataSet序列化为JSON,针对你遇到的两个问题,分别给出解决方案:
一、修复Newtonsoft.Json序列化输出XML的问题
默认情况下,Newtonsoft.Json会识别DataSet实现的IXmlSerializable接口,优先使用XML序列化逻辑,导致输出XML而非JSON。要强制生成JSON,需在序列化时配置JsonSerializerSettings,关闭XmlSerializable相关处理并处理循环引用:
var settings = new JsonSerializerSettings { Formatting = Formatting.None, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, XmlIgnore = true // 忽略XmlSerializable特性,强制采用JSON序列化逻辑 }; string json = JsonConvert.SerializeObject(dataSet, settings);
二、解决System.Text.Json循环引用错误的问题
你在ConfigureServices中配置的ReferenceHandler.Preserve仅对ASP.NET Core MVC框架的序列化生效,直接调用JsonSerializer.Serialize时需要手动传入配置好的JsonSerializerOptions:
var options = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, MaxDepth = 128, // 可根据实际数据深度调整,默认64可能不足 WriteIndented = false // 对应原代码的Formatting.None,生成紧凑JSON }; string json = System.Text.Json.JsonSerializer.Serialize(dataSet, options);
可选优化:精简序列化结果
如果默认序列化结果包含过多DataSet内部元数据(如命名空间、表属性等),可以自定义转换逻辑,只序列化核心数据:
// 将DataSet转换为仅包含表数据的集合 var data = dataSet.Tables.Cast<DataTable>().Select(table => new { TableName = table.TableName, Rows = table.AsEnumerable().Select(row => table.Columns.Cast<DataColumn>() .ToDictionary(col => col.ColumnName, col => row[col])) }); // 序列化精简后的对象 string json = System.Text.Json.JsonSerializer.Serialize(data);
内容的提问来源于stack exchange,提问作者sarsnake
相关产品推荐
相关产品推荐

