如何用 System.Text.Json 序列化文字 JSON 值?

How can I serialize a literal JSON value with System.Text.Json?

我在 C# 6 中有一个 class,类似于以下内容:

public class Foo {
   public string Name { get; set; }
   public string OtherStuff { get; set; }
}

OtherStuff 属性 是已知有效的 JSON 编码字符串。

我正在尝试使用默认的 System.Text.Json 序列化程序从 API 方法 return 这个 class 。但是我希望 OtherStuff 直接写成 ,而不是转义为字符串值。

我尝试过的事情:

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)
    => writer.WriteStringValue(value); // Can't find a method to write a pre-encoded value
}

我想避免将这个字符串从 JSON 解析为一个对象,这样我就可以在 JSON 中重新发出它。它是我数据库中的 JSON 字符串,数据模型对 API.

是不透明的

谁能提出解决方案?

System.Text.Json 从版本 6 开始支持此方法,方法称为 WriteRawValue:

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) =>        
        writer.WriteRawValue(value);        
}

如果您使用的是 .NET 6,则它默认可用。否则,您可以安装版本 6 的 nuget 包 System.Text.Json 来访问此功能(此包支持 .NET Standard,因此甚至可以在旧的 .NET 4 中使用)。

请注意,它接受第二个参数:skipInputValidation,因此为了获得更高的性能,如果您确定您所写的内容有效 json - 您可以跳过它并使用 WriteRawValue(value, true).