使用Newtonsoft.Json更新反序列化类单个值并保留其余原值的实现咨询
实现方案
你遇到的核心问题是Data类中的所有属性都声明为了静态(static),静态属性属于类本身而非实例对象,反序列化得到的GV.Root实例里的data对象的属性值不会同步到静态属性上,这是你无法正常修改单个属性的核心原因。
步骤1:修正实体类定义
先移除Data类所有属性的static修饰符:
public class GV { public class Data { [JsonProperty("pathForNESPosters")] public string PathForNESPosters { get; set; } [JsonProperty("pathForSNESPosters")] public string PathForSNESPosters { get; set; } [JsonProperty("pathForSEGAPosters")] public string PathForSEGAPosters { get; set; } [JsonProperty("pathToNESContent")] public string PathToNESContent { get; set; } [JsonProperty("pathToSNESContent")] public string PathToSNESContent { get; set; } [JsonProperty("pathToSEGAContent")] public string PathToSEGAContent { get; set; } [JsonProperty("lastSavedVolume")] public double LastSavedVolume { get; set; } } public class Root { public Data data { get; set; } } }
步骤2:修改单个属性值
你反序列化得到的myDeserializedClass就是已经加载了所有JSON值的实例,直接修改它内部的属性即可,不需要重新new整个类,其余属性值会自动保留:
// 仅修改指定属性,不影响其他原有属性值 myDeserializedClass.data.PathToNESContent = "new value here";
步骤3:序列化写回文件
序列化时会自动保留所有未修改的原有属性值,直接覆盖原文件即可:
// Formatting.Indented参数用于保留JSON格式化缩进,和原文件格式保持一致 string outputJson = JsonConvert.SerializeObject(myDeserializedClass, Formatting.Indented); // 建议用Path.Combine拼接路径,避免不同系统斜杠兼容问题 string jsonFilePath = Path.Combine(currentAssemblyPath, @"Resources\dataForLinks.json"); File.WriteAllText(jsonFilePath, outputJson);
如果你需要全局共享这个配置对象,可以把
myDeserializedClass声明为全局静态变量,而不是把实体类的属性设为静态,这样既可以全局访问修改,也不会影响序列化/反序列化逻辑。
内容的提问来源于stack exchange,提问作者StealthRT
相关产品推荐
相关产品推荐

