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

EF架构REST API中如何让字符串属性返回原生JSON而非转义字符串

解决方案:让原生JSON字符串直接输出为JSON对象

在ASP.NET Core的REST API中,你可以根据项目使用的JSON序列化库(默认的System.Text.Json或者常用的Newtonsoft.Json)来实现类似Spring @JsonRawValue的效果,下面分别给出两种实用方案:

方案1:使用默认的System.Text.Json

方法A:将属性类型改为JsonElement

这是最简洁的实现方式,直接修改WidgetDTO里的Options属性类型:

public class WidgetDTO
{
    // 其他属性...
    public JsonElement Options { get; set; }
}

从数据库读取字符串格式的JSON后,只需把它解析成JsonElement即可:

var foundWidget = await WidgetManager.GetWidget(widgetId);
var widgetDto = Mapper.Map<WidgetDTO>(foundWidget);
// 解析数据库返回的字符串JSON为JsonElement
widgetDto.Options = JsonSerializer.Deserialize<JsonElement>(foundWidget.Options);

这样序列化时,JsonElement会直接输出为原生JSON对象,不会被转义。

方法B:自定义JsonConverter(保留string类型)

如果你想保持Options的string类型不变,可以写一个自定义转换器:

public class RawJsonStringConverter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 反序列化时直接返回JSON字符串
        return reader.GetString() ?? string.Empty;
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        // 序列化时直接写入原始JSON,跳过转义逻辑
        writer.WriteRawValue(value);
    }
}

然后在WidgetDTO的属性上标记这个转换器:

public class WidgetDTO
{
    // 其他属性...
    [JsonConverter(typeof(RawJsonStringConverter))]
    public string Options { get; set; }
}

配置完成后,返回响应时Options的字符串JSON就会直接以对象形式输出。

方案2:使用Newtonsoft.Json(Json.NET)

如果你的项目配置了使用Newtonsoft.Json(ASP.NET Core 3.0+需要手动引入),可以直接用和Spring几乎一致的注解:

using Newtonsoft.Json;

public class WidgetDTO
{
    // 其他属性...
    [JsonRawValue]
    public string Options { get; set; }
}

Newtonsoft.Json会自动识别这个特性,把字符串属性当作原生JSON输出,无需额外处理。

注意事项

  • 确保存储的JSON字符串是合法格式,否则会导致序列化失败。
  • 如果使用AutoMapper映射,需要注意类型适配(比如方案1的方法A中,可能需要配置AutoMapper将string转为JsonElement)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:44