C# Json双重序列化时如何避免出现\u0022引号转义编码问题
问题原因
你遇到的\u0022转义是.NET内置System.Text.Json库的默认编码器行为:默认会将双引号等特殊字符转换为Unicode转义序列,而非你预期的\"转义格式。
解决方案
有两种常用实现方式,可根据你的业务场景选择:
方案1:调整序列化编码器配置(保留双重序列化逻辑)
如果你确实需要先把Contract序列化为字符串再存入Request.dataObject,只需要在序列化Request时传入自定义配置,使用宽松的JSON编码器即可:
- 先引入命名空间:
using System.Text.Encodings.Web; - 修改序列化代码:
public static void Main() { Request request= new Request(); Contract contract = new Contract(); contract.number= "12345"; var contractSerialized = JsonSerializer.Serialize(contract); Console.WriteLine(contractSerialized); request.dataObject= contractSerialized; // 新增序列化配置 var jsonOptions = new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; var payload= JsonSerializer.Serialize(request, jsonOptions); Console.WriteLine( payload ); }
注意:
UnsafeRelaxedJsonEscaping不会对特殊字符做安全转义,如果输出内容要直接嵌入HTML页面存在XSS风险,仅用于后端接口间JSON传输无影响。
方案2:避免双重序列化(更推荐)
如果你没有强制要求dataObject必须是字符串类型,直接修改Request类的字段类型,不需要提前序列化Contract,一次性完成整个对象的序列化,从根源上避免转义问题:
// 修改Request类定义 public class Request { // 改为Contract类型或者object类型 public Contract dataObject { get; set; } } // 对应的Main方法代码 public static void Main() { Request request= new Request(); Contract contract = new Contract(); contract.number= "12345"; // 不需要提前序列化Contract,直接赋值 request.dataObject= contract; var payload= JsonSerializer.Serialize(request); Console.WriteLine( payload ); }
这个方案输出的dataObject是原生JSON对象,没有任何转义字符,适配绝大多数业务场景。
内容的提问来源于stack exchange,提问作者user7071176
相关产品推荐
相关产品推荐

