You need to enable JavaScript to run this app. C# Json双重序列化时如何避免出现\u0022引号转义编码问题
优惠活动
大模型
产品
解决方案
定价
更多

C# Json双重序列化时如何避免出现\u0022引号转义编码问题

问题原因

你遇到的\u0022转义是.NET内置System.Text.Json库的默认编码器行为:默认会将双引号等特殊字符转换为Unicode转义序列,而非你预期的\"转义格式。

解决方案

有两种常用实现方式,可根据你的业务场景选择:

方案1:调整序列化编码器配置(保留双重序列化逻辑)

如果你确实需要先把Contract序列化为字符串再存入Request.dataObject,只需要在序列化Request时传入自定义配置,使用宽松的JSON编码器即可:

  1. 先引入命名空间:using System.Text.Encodings.Web;
  2. 修改序列化代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 13:24:01