You need to enable JavaScript to run this app. C#将DraftForm类转换为JSON时接口返回字符串而非JSON的问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 00:36:04