C#将DraftForm类转换为JSON时接口返回字符串而非JSON的问题求解
接口返回字符串而非结构化JSON的原因
当前代码存在两层序列化的逻辑冲突:
- 仓储层手动调用
JsonConvert.SerializeObject,将查询到的DraftForm列表转成了JSON格式的纯字符串 - ASP.NET Web API管道本身内置了序列化能力,当它接收到字符串类型的返回值时,会将其视为普通业务文本,再做一次转义包装
最终接口返回的内容会带有外层引号、转义的反斜杠,Postman中识别为字符串类型,而非可解析的JSON对象/数组。
修复步骤
1. 移除仓储层的手动序列化逻辑
仓储层仅负责数据库数据查询,不要主动执行JSON序列化操作,把序列化流程完全交还给Web API管道处理。
修改后的仓储方法示例:
public List<DraftForm> GetAllDraftDossier() { return _context.DraftForms .Where(x => x.DraftName == "Repairer") .ToList(); }
2. 全局配置驼峰命名序列化规则
之前手动序列化时配置的CamelCasePropertyNamesContractResolver(属性名转驼峰),需要迁移到Web API全局配置中,保留原有序列化效果。在WebApiConfig的注册方法中添加配置:
// 配置JSON格式化器的全局规则 var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 可选:移除默认XML格式化器,让接口默认返回JSON格式 GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
3. 调整控制器返回逻辑
将控制器的返回值匹配强类型列表,直接把查询结果传入Ok()方法,由Web API完成正确的序列化:
[Route("repair/UnfinishedDossiers")] [HttpGet] public IHttpActionResult GetAllDraftDossier() { var draftDossiers = _dossierRepairRepository.GetAllDraftDossier(); return Ok(draftDossiers); }
特殊场景适配
如果DraftForm类中的Json属性存储的是已经格式化好的表单JSON片段,需要将其作为内嵌JSON节点返回、而非转义后的纯文本字符串,可以为该属性配置自定义JSON转换器,让序列化器识别该字段的JSON格式字符串,避免额外转义。
内容的提问来源于stack exchange,提问作者hiba nebli
相关产品推荐
相关产品推荐

