.NET接口返回Blog对象时JSON转义异常,需修正为单斜杠
问题说明
单独返回blog.en_content或控制台打印时,输出的JSON格式正常:
{"blocks":[{"key":"51q6n","text":"The purpose of this website is multi-fold:","type":"unstyled","
但返回整个Blog对象时,en_content字段出现三重转义斜杠,结果变成:
{\"blocks\":[{\"key\":\"51q6n\",\"text\":\"The purpose of
问题根源
en_content本身是JSON格式的字符串,当ASP.NET Core序列化整个Blog对象时,会把字符串里的双引号再次转义——原本的"被转成\",最终在返回的JSON里就呈现为三重转义的\\"。
解决办法
这里给三个实用方案:
方案1:改成强类型实体
如果en_content的JSON结构固定,先定义对应实体类:
// 对应blocks里的结构 public class ContentBlock { [JsonPropertyName("key")] public string Key { get; set; } [JsonPropertyName("text")] public string Text { get; set; } [JsonPropertyName("type")] public string Type { get; set; } // 其他字段根据实际JSON结构补充 } // 修改Blog实体类 public class Blog { [JsonPropertyName("id")] public required string id { get; set; } [JsonPropertyName("en_content")] public required List<ContentBlock> en_content { get; set; } [JsonPropertyName("cn_content")] public required List<ContentBlock> cn_content { get; set; } }
之后查询数据时,把存储的JSON字符串反序列化为List<ContentBlock>类型,返回整个对象时就不会出现多余转义了。
方案2:用JsonRawValue特性
不想改实体类型的话,给en_content和cn_content加上[JsonRawValue]特性,告诉序列化器直接输出原始字符串,不做转义:
public class Blog { [JsonPropertyName("id")] public required string id { get; set; } [JsonPropertyName("en_content")] [JsonRawValue] public required string en_content { get; set; } [JsonPropertyName("cn_content")] [JsonRawValue] public required string cn_content { get; set; } }
注意:必须保证en_content是有效的JSON字符串,否则返回的JSON会格式错误。
方案3:手动处理后返回
如果不想改实体,也可以在接口里临时处理:
using System.Text.Json.Nodes; [HttpGet("blog/{blog_id}")] [AllowAnonymous] public async Task<IActionResult> get_blog(string blog_id) { var blog = await _blogs.Find(b => b.id == blog_id).FirstOrDefaultAsync(); if (blog == null) return NotFound("Blog not found."); var result = new { id = blog.id, en_content = JsonNode.Parse(blog.en_content), cn_content = JsonNode.Parse(blog.cn_content) }; return Ok(result); }
把字符串转成JsonNode后再返回,序列化时会自动处理成正常的JSON结构。
内容的提问来源于stack exchange,提问作者Xi Luo
相关产品推荐
相关产品推荐

