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

