我的应用程序读取使用以下格式创建的JSON文件:
{
"myProperty": {complex JSON here}
}
class MyClass
{
public MyChildClass MyProperty {get; set;}
}
我需要更改类的工作方式,以使它看起来像这样:
class MyClass
{
public MyNewChildClass MyNewProperty {get; set;}
}
,而且我需要能够支持以旧格式创建的文件,而且还必须支持使用新格式创建的文件。
我有将MyChildClass
对象转换为MyNewChildClass
对象的代码,但是如何设置序列化,以便该对象可以反序列化旧格式,从而更改属性名称和类型MyChildClass MyProperty
到MyNewChildClass MyNewProperty
并在序列化时使用新格式,如果JSON文件包含该格式,则使用新格式反序列化?
答案 0 :(得分:2)
如果您同时使用这两个属性,则json将同时适用于新旧版本。
class MyClass
{
[JsonPropert("myProperty")]
public MyChildClass MyProperty {get; set;}
[JsonProperty("myNewProperty")] // -> Remember, case matters.
public MyNewChildClass MyNewProperty {get; set;}
}
反序列化类时,添加检查以查看哪个不为null并使用该值(我猜每个方法都不同)。这应该可以帮助您将重大更改降至最低。
顺便说一句>。如果您有将新代码转换为旧代码的代码,反之亦然,则可以检查old的值是否为null,然后运行该流程/方法,您必须将new转换为old,然后继续该对象。请记住,必须是反序列化之后,
var properties = JsonConvert.DeserializeObject<MyClass>("data");
if (properties.MyNewProperty == null)
{
properties = myMethodToConvertOldToNew(properties);
}
public MyClass myMethodToConvertOldToNew(MyClass)
{
if (properties.New == null)
{
properties.New = ConversionMethod(properties.Old, properties.New);
// dont have to, but,
properties.Old = null;
}
return properties.
}
答案 1 :(得分:1)
为什么不将私有属性添加到将设置新属性的类中?
class MyClass
{
[JsonProperty]
private MyChildClass MyProperty { set => MyNewProperty = YourConversionMethod(value); }
public MyNewChildClass MyNewProperty { get; set; }
}
JsonProperty
属性将确保使用私有设置器。