使用Newtonsoft序列化DataTable时出现异常行为
问题原因及解决方案
这问题我之前做WebApi项目时也踩过一模一样的坑!核心原因是Web API的默认JSON处理机制和你手动调用Newtonsoft序列化的操作发生了二次序列化冲突:
为什么会出现多余的转义符?
在Windows Forms程序里,你调用JsonConvert.SerializeObject(dt)直接得到的是纯JSON字符串,没有后续额外处理,所以结果完全正常。但在WebApi场景下:
- 如果你手动把DataTable序列化成字符串,然后直接返回这个字符串(比如Action返回
string类型),WebApi会把这个字符串当成普通文本,再用内置的序列化器重新处理一遍——这就导致原本的JSON双引号被转义,出现\"这种格式。 - 说白了就是:你做了一次序列化,WebApi又帮你做了一次,双重处理就产生了多余的转义符。
解决办法(按优先级推荐)
1. 直接返回DataTable对象,让WebApi自动序列化
这是最省心的方式,完全不用手动序列化,把DataTable直接交给WebApi的内置序列化器处理就行:
// ASP.NET WebApi示例 public IHttpActionResult GetUsuarioData() { DataTable usuarioTable = ObtenerTuDataTable(); // 替换成你的数据获取逻辑 return Ok(usuarioTable); // 框架会自动用Newtonsoft完成序列化,不会有转义问题 } // ASP.NET Core示例 public IActionResult GetUsuarioData() { DataTable usuarioTable = ObtenerTuDataTable(); return Ok(usuarioTable); }
2. 手动序列化后,明确告知WebApi返回成品JSON
如果因为特殊需求必须手动序列化(比如自定义了序列化规则),一定要让WebApi知道你返回的是已经处理好的JSON,别再二次加工:
// ASP.NET WebApi示例 public HttpResponseMessage GetUsuarioData() { DataTable usuarioTable = ObtenerTuDataTable(); string jsonResult = JsonConvert.SerializeObject(usuarioTable); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(jsonResult, Encoding.UTF8, "application/json") }; } // ASP.NET Core示例 public IActionResult GetUsuarioData() { DataTable usuarioTable = ObtenerTuDataTable(); string jsonResult = JsonConvert.SerializeObject(usuarioTable); return Content(jsonResult, "application/json"); }
3. 检查WebApi的序列化配置
确认你的WebApi项目已经正确配置Newtonsoft.Json作为默认序列化器(避免和内置的System.Text.Json冲突),比如在WebApiConfig.cs中:
public static void Register(HttpConfiguration config) { // 移除默认的XML格式化器,只保留JSON config.Formatters.Remove(config.Formatters.XmlFormatter); // 配置Newtonsoft序列化规则 config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, // 可选:格式化输出JSON NullValueHandling = NullValueHandling.Ignore // 可选:忽略空值字段 }; }
总结
核心就是避免双重序列化:要么让WebApi直接处理你的DataTable对象,要么明确告诉它返回的是已经完成序列化的JSON字符串,不要额外加工。
内容的提问来源于stack exchange,提问作者Leonardo Perez
相关产品推荐
相关产品推荐

