Json.NET向后兼容性:编写新的属性名称,但要读取新属性或旧属性

Jae*_*aex 5 c# serialization json json.net

让我们假设我喜欢这个属性,我用它来保存/加载设置:

public Options RectangleCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想更改属性名称RegionCaptureOptions而不是RectangleCaptureOptions.但是,如果我更改属性名称,那么Json .NET将无法找到它反序列化.

这里接受的答案不起作用:

.NET NewtonSoft JSON将映射反序列化为不同的属性名称

因为如果我使用JsonProperty:

[JsonProperty("RectangleCaptureOptions")]
public Options RegionCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后它还将序列化属性,因为RectangleCaptureOptions它是旧名称.

因此,当我更改变量或属性的名称时,仍然希望在反序列化时(RegionCaptureOptions或者RectangleCaptureOptions对于此示例)支持它们的旧命名,但在序列化(RegionCaptureOptions)时使用当前名称.这样,我可以在加载(反序列化)它们时为我的设置json文件提供向后兼容性支持.

我认为最干净的解决方案是制作自定义属性JsonAlternativeName,如下所示:

[JsonAlternativeName("RectangleCaptureOptions")]
public Options RegionCaptureOptions { get; set; }
Run Code Online (Sandbox Code Playgroud)

可选地,它可以具有多个参数支持,这样您可以添加多个替代名称.

但不确定如何完成它(或者根本不可能)并且无法在StackOverflow中找到类似的解决方案,因为在我发现的每个问题中,人们建议使用JsonProperty哪些对我的情况没有帮助.