JSON保存设置项异常复原问题

一、问题概述:

在WPF项目中新建了文件Settings.json,用于保存开机自启动的设置记录,并将其属性设置为“内容–始终复制”以将JSON文件添加到项目文件夹中。

1
2
3
{
"AutoStartEnabled": false
}

定义了下面的方法来载入设置的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void LoadSettings()
{
if (File.Exists(SettingsFilePath))
{
string json = File.ReadAllText(SettingsFilePath);
dynamic settings = JsonConvert.DeserializeObject(json);
AutoStartEnabled = settings.AutoStartEnabled;
}
else
{
// 如果文件不存在,初始化默认设置
AutoStartEnabled = false;
}
}
  • 运行程序,发现每次启动时,通过UI反馈的记录均为False,即使手动修改为True也会在运行的一瞬间变成False。

二、寻找原因:

  • 手动修改为True扔不起效,可排除保存记录异常的情况。
  • 怀疑是UI控件初始属性为False导致,查找之后未发现异常。
  • 通过断点追踪,发现在程序读取JSON文件内容之前就已经变成了false。
  • 又怀疑是程序在初始化时触发了按钮的取消选中事件,但未触发断点,可以排除。
  • 这时突然想起“内容–始终复制”的属性,问题原因终于找到了。

三、问题复现

  • 选中按钮后,修改JSON中"AutoStartEnabled"的值为True。
  • 再次启动程序时,“始终复制”的属性使得开发环境中的Settings.json复制到编译后的程序所在的文件夹,将修改了的Json文件覆盖,造成属性异常变成False的假象。

四、解决问题

  • 直接从源头解决问题,将开发环境中的json文件删除,杜绝文件被覆盖的可能性。
  • 经过测试,现有方法支持在未找到json文件时创建文件,因此不需添加新建Json文件的程序。

五、回顾反思

  • 通过测试发现,直接从文件夹启动编译后的程序不会出现覆盖的问题,证实了前面的分析。
  • 能被这种小问题困扰如此之久,反映出自己对开发工具的不熟悉和思维深度的不足,也提示自己要通过积极寻找问题来积累自己的经验。

JSON保存设置项异常复原问题
http://blog.morely.top/2025/02/10/JSON保存设置项异常复原问题/
作者
陌离
发布于
2025年2月10日
许可协议