【问题标题】:How can I serialize a literal JSON value with System.Text.Json?如何使用 System.Text.Json 序列化文字 JSON 值?
【发布时间】:2021-12-23 23:53:54
【问题描述】:

我在 C# 6 中有一个类,如下所示:

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

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

我正在尝试使用默认的System.Text.Json 序列化程序从 API 方法返回此类。但我希望将OtherStuff 写出字面意思,而不是转义为字符串值。

我尝试过的事情:

  • 在JsonSerializerOptions 中寻找可以做到这一点的东西。
  • 尝试使用System.Text.Json.Nodes.JsonNode 而不是string。它仍然将值作为字符串发出。
  • 尝试编写自定义JsonConverter,但Write() 方法采用Utf8JsonWriter,这似乎没有办法将字符串作为文字值,只能将字符串写成 JSON 字符串。
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 是不透明的。

谁能提出解决方案?

【问题讨论】:

  • 旁注:在 Json.Net 中,您可以使用 [JsonProperty(Type = typeof(JRaw)]

标签: c# asp.net .net system.text.json


【解决方案1】:

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)。

【讨论】:

  • 这是完美的,谢谢!我不知道我是如何在方法列表中错过的。我一定看过 20 遍。
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2021-02-23
相关资源
最近更新 更多