使用FileStream写入JSON后反序列化遇额外字符错误,求解决方法
问题原因与解决方案
这个问题我之前踩过一模一样的坑!核心原因其实很简单:你用FileMode.Open打开文件时,如果新写入的JSON内容长度比文件原有内容短,文件末尾会残留旧内容的一部分字节——这些多余的字节会被当成JSON的一部分,导致反序列化时读到额外字符,触发JsonReaderException。
为什么原来的File.CreateText没问题?
File.CreateText本质是创建新文件(如果文件已存在就直接覆盖),相当于把旧文件的所有内容完全清空后再写入新JSON,自然不会有残留内容。而FileMode.Open只是打开现有文件,写入时从文件开头开始覆盖,但不会自动截断超出新内容长度的旧字节。
解决方法
最直接有效的方案是改用FileMode.Truncate模式打开文件——这个模式会先将现有文件的大小清空为0,再写入新内容,彻底避免残留问题:
var utf8WithoutBom = new System.Text.UTF8Encoding(false); using (var fs = new FileStream(jsonFile, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite)) { using (var sr = new StreamWriter(fs, utf8WithoutBom)) { sr.Write(content); } }
补充说明
- 你之前尝试修改编码没用,是因为问题根源不是字符编码解析错误,而是文件里有多余的残留字节——换编码只是改变了这些残留字节的显示形式,并没有消除它们。
- 如果追求代码简洁,也可以用
File.WriteAllText(默认会覆盖文件),但如果需要指定FileShare.ReadWrite权限,还是用FileStream + Truncate的组合更稳妥。
内容的提问来源于stack exchange,提问作者Micah Montoya
相关产品推荐
相关产品推荐

