如何使用System.Text.Json序列化预编码的字面量JSON值?
你可以通过修改自定义JsonConverter,调用Utf8JsonWriter的WriteRawValue方法实现需求,该方法从.NET 5开始原生支持,无需解析预编码JSON字符串,直接将内容作为合法JSON片段写入输出流,完全不会额外转义。
步骤1:修改自定义JsonConverter
public class LiteralJsonConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString(); public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { // 处理null值场景,若业务保证OtherStuff不会为null可省略该判断 if (value == null) { writer.WriteNullValue(); return; } // 直接写入原始JSON片段,第二个参数传true表示跳过输入合法性校验(你已提前验证JSON合法时使用,可提升性能) writer.WriteRawValue(value, skipInputValidation: true); } }
步骤2:给目标属性标记Converter特性
public class Foo { public string Name { get; set; } [JsonConverter(typeof(LiteralJsonConverter))] public string OtherStuff { get; set; } }
效果验证
假设OtherStuff的取值为预编码JSON {"id":123,"content":"测试内容"},序列化后的最终输出为:
{ "Name": "你的Name属性值", "OtherStuff": {"id":123,"content":"测试内容"} }
不会出现任何转义字符,也没有额外的JSON解析/序列化开销。
.NET 5以下版本兼容方案
如果你使用的是不支持WriteRawValue的低版本.NET,也可以将OtherStuff属性类型改为JsonDocument,赋值时调用JsonDocument.Parse(预编码JSON字符串)即可,该方案会产生少量JSON解析开销,但不需要你感知内部结构,序列化时也会原样输出。
内容的提问来源于stack exchange,提问作者richardtallent
相关产品推荐
相关产品推荐

