You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:41:24