System.Text.json 从 json 文件读取 JsonSerializer unicode 问题

System.Text.json JsonSerializer unicode issue on read from json file

在 C# .net 核心环境中,使用 System.Text.Json unicode 字符进行替换。例如“ü”在将 json 文件读入对象列表后显示为另一个符号

Passwort zurücksetzen

变成

Passwort zur�cksetzen

我尝试设置 json 选项:

JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
this.messageTemplates = 
JsonSerializer.Deserialize<List<MessageTemplate>>(messageTemplateJsonData, jso);

这并没有改变行为。

有什么想法吗?

更新:问题已解决

正如 diogoaos 所怀疑的那样,问题并没有发生在 json 反序列化器中,而是发生在 json 文档从文件中读入时。所以解决方案是将文件保存为 utf-8 并为文件设置编码 reader:

string messageTemplateJsonData = File.ReadAllText(messageTemplatesFilename, System.Text.ASCIIEncoding.UTF8);
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
this.messageTemplates = JsonSerializer.Deserialize<List<MessageTemplate>>(messageTemplateJsonData, jso);

这似乎是在这种情况下出现的问题。也许您正在没有相同默认编码的组件之间传输此字符串,或者正在读取编码与您的 CLR 默认编码不同的文件。

在对您的问题的评论中,您说“我将数据打印到控制台”。您可以打印原始字符串(在反序列化之前,这个 messageTemplateJsonData 对象)吗?他的角色显示正确吗?

或者你可以用这个字符在内部创建一个字符串(不是从外部读取,而是在你的代码中做一个文字),看看是否发生错误。

我试图在 Csharp 笔记本上重现这个问题(在 vscode 中),并得到了正确的结果,但这是 .Net 6,所以它可能是版本问题。