使用Newtonsoft.JSON在json配置文件中序列化时保留现有条目

nsc4cvqm  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(106)

我有点纠结于JSON设置文件的处理。目前,我们正在将程序启动时的设置文件反序列化为已定义的对象,并在应用程序终止时将对象序列化为文件。我们会不时地更改对象结构(主要是添加新实体,但有时会删除过时的条目等),这会导致我们的开发人员以及使用不同版本(或开发版本)的高级用户感到困惑,因为设置文件总是被覆盖并强制使用当前应用程序版本的格式。
我的问题是有没有一种好的方法来保留当前运行的应用程序版本不“知道”的JSON条目?我已经考虑过通过只更新当前版本知道的那些条目而不触及文件中已经存在的其他条目来实现这种行为。或者通过在内存中保存一个对象列表,解析器在反序列化(由于不同数据类型的不同序列化,这可能有点复杂)和序列化这些条目之后不知道。但我不是牛顿软件Maven,所以我不知道如何将此转换为代码。
有没有人对这个问题有什么建议或最佳实践?

p1iqtdky

p1iqtdky1#

一个解决方案是使用属性JsonExtensionData。此属性指示在此处设置未Map的属性。

string json = @"{
  'UnknowProp1': 'Some value',
  'Id': 1,
  'Label': 'Hello',
  'UnknowProp2': 'Other value',
}";

var dto = JsonConvert.DeserializeObject<Dto>(json);
var result = JsonConvert.SerializeObject(dto, Formatting.Indented);

Console.WriteLine(result);

public class Dto
{
    public int Id { get; set; }
    public string Label { get; set; }

    [JsonExtensionData]
    private IDictionary<string, JToken> _additionalData;
}

结果:

{
  "Id": 1,
  "Label": "Hello",
  "UnknowProp1": "Some value",
  "UnknowProp2": "Other value"
}

但命令没有得到遵守。

相关问题