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
相关产品推荐
相关产品推荐

