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

如何在Utf8JsonWriter中正确写入预序列化嵌套JSON对象避免引号转义

问题原因

你当前的实现中,JsonSerializer.Serialize(foo.Bar)返回的是完整的JSON字符串,调用WriteString方法时,Utf8JsonWriter会将该内容作为普通字符串值处理,自动转义字符串内的所有特殊字符(包括双引号),因此会出现引号被转义为\u0022的问题,最终bar字段会是转义后的字符串值,而非预期的嵌套JSON结构。

解决方案

方案1:直接序列化对象到writer(推荐)

直接调用JsonSerializer.Serialize的重载方法,将复杂对象直接写入当前Utf8JsonWriter实例,避免走多余的字符串序列化和转义流程:

public override void Write(Utf8JsonWriter writer, Foo foo, JsonSerializerOptions options)
{
    writer.WriteStartObject();
    writer.WriteString("simpleField1", "value1");
    writer.WriteString("simpleField2", "value2");
    // 先写入字段名
    writer.WritePropertyName("bar");
    // 直接将Bar对象序列化写入当前writer,透传全局配置options保证序列化行为一致
    JsonSerializer.Serialize(writer, foo.Bar, options);
    
    writer.WriteEndObject();
    // 无需手动调用Flush,JsonSerializer框架会自动处理输出
}

方案2:写入预序列化的JSON字符串

如果你已经提前得到了序列化完成的合法JSON字符串,可以使用WriteRawValue方法直接写入原始JSON内容:

public override void Write(Utf8JsonWriter writer, Foo foo, JsonSerializerOptions options)
{
    writer.WriteStartObject();
    writer.WriteString("simpleField1", "value1");
    writer.WriteString("simpleField2", "value2");
    
    string preSerializedBar = JsonSerializer.Serialize(foo.Bar, options);
    writer.WritePropertyName("bar");
    // 第二个参数设为true可跳过JSON合法性校验,确定输入合法时使用可提升性能
    writer.WriteRawValue(preSerializedBar, skipInputValidation: true);
    
    writer.WriteEndObject();
}
注意事项
  • 不需要在自定义转换器的Write方法中手动调用Flush,框架会在序列化完成后统一处理输出,提前Flush可能导致输出结构异常。
  • 内部序列化调用请透传外部传入的JsonSerializerOptions参数,保证命名策略、自定义转换器等全局配置生效,避免内外层序列化行为不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:54:03