使用 System.Text.Json.JsonSerializer 处理无效的 UTF-16 字符

Eva*_*nei 5 c# json utf-8 .net-core system.text.json

我正在尝试使用 .json 将字符串 JSON 反序列化为对象System.Text.Json.JsonSerializer。有时,我尝试反序列化的 JSON 中包含无效的 UTF-16 字符。例如,该字符\udcbf无法反序列化为 UTF-16 字符串。我试图遵循此处的准则来自定义字符编码,但这似乎只适用于序列化。

dotnet fiddle来显示问题。请注意,我使用的 JSON 编码器支持从 0x0000 到 0xFFFF 的所有 unicode 字符。这个范围包含 0xDCBF,这让我相信指定的编码器不用于反序列化。

我尝试做的一件事是编写一个自定义转换器来处理这些无效字符:

public class InvalidUtf16Converter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        try
        {
            return reader.GetString();
        }
        catch (InvalidOperationException)
        {
            var bytes = reader.ValueSpan;
            var sb = new StringBuilder(bytes.Length);
            foreach (var b in bytes)
                sb.Append(Convert.ToChar(b));
            return sb.ToString();
        }
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) =>
        writer.WriteStringValue(value);
}
Run Code Online (Sandbox Code Playgroud)

这种做法有点适用于字符串属性(实际上并没有读入一个字符)为看到这里。不幸的是,我有时在列表中有无效的 UTF-16 字符。在这种情况下,提供转换器不工作,因为看到这里,因为转换器试图将一个列表转换成一个字符串,它可以理解的休息。

有没有办法全局处理反序列化中无效的 UTF-16 字符System.Text.Json?如果没有,我将如何为列表编写类似于上述转换器的转换器?