You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中如何从数据库返回规范缩进JSON并适配Swagger?

问题描述

数据库中存储的nvarchar内容为:

"{\"prop1\": {\"test7\": \"test\"}}"

但通过返回类型为async Task<IActionResult>的接口,用return Ok(response)返回的内容却是带有多余CRLF的不完整格式:

"{
  \"prop\":{
  \"test7\":\"test\"}"

需求是获取带有缩进的标准JSON格式,项目支持使用System.Text.Json或Newtonsoft.Json库。

排查更新

问题并非出在Swagger,而是EF Core的DbContext:执行查询

var allByExternalId = _requests.Where(x => x.CorrelationId == correlationId); // 返回的IQueryable实体属性包含CRLF

时,读取到的JSON字符串属性被混入了CRLF,需要让EF Core不对该字符串做解析处理,保留原始的JSON缩进结构。

解决方案

1. 配置EF Core直接读取原始字符串

EF Core默认会对字符串做转义或换行处理,可通过实体映射配置让它直接读写原始nvarchar内容:
在实体配置类(或OnModelCreating方法中),对目标JSON属性设置HasConversion,跳过额外解析:

modelBuilder.Entity<YourRequestEntity>()
    .Property(x => x.TargetJsonProperty)
    .HasConversion(
        input => input,  // 写入数据库时直接存储原始字符串
        output => output // 读取时直接返回原始字符串,不做任何解析
    );

注意:如果该属性之前被配置为HasColumnType("json")这类JSON类型映射,需要移除该配置,保持为nvarchar的原始类型映射。

2. 全局配置接口返回的JSON格式化

可以通过全局配置让所有接口返回带缩进的标准JSON:

基于System.Text.Json的配置

在Program.cs中添加:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.WriteIndented = true;
    });

基于Newtonsoft.Json的配置

先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包,再在Program.cs中配置:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
    });

3. 手动处理单个属性的格式修正

如果仅需处理该特定JSON属性,可在返回前手动解析后重新序列化:

System.Text.Json实现

var targetEntity = await allByExternalId.FirstOrDefaultAsync();
// 先解析原始字符串为对象,再重新序列化为带缩进的JSON
var jsonObject = JsonSerializer.Deserialize<object>(targetEntity.TargetJsonProperty);
targetEntity.TargetJsonProperty = JsonSerializer.Serialize(jsonObject, new JsonSerializerOptions { WriteIndented = true });
return Ok(targetEntity);

Newtonsoft.Json实现

var targetEntity = await allByExternalId.FirstOrDefaultAsync();
var jsonObject = JsonConvert.DeserializeObject(targetEntity.TargetJsonProperty);
targetEntity.TargetJsonProperty = JsonConvert.SerializeObject(jsonObject, Formatting.Indented);
return Ok(targetEntity);

内容的提问来源于stack exchange,提问作者lonelydev101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:00:16