使用System.Text.Json序列化写入文件丢失波兰语变音符号求助
解决System.Text.Json序列化写入文件丢失波兰语变音符号的问题
直接使用JsonSerializer内置的文件序列化方法(推荐)
最简单的方式是跳过手动处理StreamWriter,直接用System.Text.Json.JsonSerializer.SerializeToFile方法,它默认使用UTF-8编码,能正确保留所有Unicode字符:
// 基础用法 System.Text.Json.JsonSerializer.SerializeToFile(paginatedData, filePath); // 如果需要保留原字符(避免转义成\uXXXX格式),添加配置选项 var options = new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; System.Text.Json.JsonSerializer.SerializeToFile(paginatedData, filePath, options);
手动处理流时的正确配置
如果必须保留原有的流操作逻辑,需要同时修复序列化和写入两个环节的配置:
- 序列化时禁用Unicode字符转义,确保波兰语变音符号以原字符形式保存
- 使用UTF-8编码写入文件(避免系统默认ANSI编码或UTF-16导致的识别问题)
修改后的代码如下:
var options = new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; var stringoo = System.Text.Json.JsonSerializer.Serialize(paginatedData, options); using (var stream = new FileStream(filePath, FileMode.Create)) using (var writetext = new StreamWriter(stream, Encoding.UTF8)) { writetext.Write(stringoo); }
问题原因分析
你遇到的问题大概率是以下两种情况之一:
- 序列化转义:默认情况下
System.Text.Json会将非ASCII字符转义为\uXXXX格式(比如ą变成\u0105),虽然JSON解析器能正确识别,但普通文本编辑器打开时会显示转义码而非原字符,看起来像是符号丢失。 - 写入编码错误:你之前尝试的
Encoding.Unicode是UTF-16编码,部分JSON工具或文本编辑器默认以UTF-8读取文件,会导致乱码;而默认StreamWriter使用的系统ANSI编码不支持所有Unicode字符,直接写入会丢失变音符号。
后续排查方向
- 用VS Code等编辑器打开生成的JSON文件,查看右下角显示的文件编码,确认是UTF-8。
- 检查JSON内容:如果看到
\uXXXX格式的转义序列,说明是序列化配置问题;如果是问号或乱码,说明是写入时的编码问题。
内容的提问来源于stack exchange,提问作者kkkristo
相关产品推荐
相关产品推荐

