C# 自定义JSON序列化/反序列化以多种可能的格式读取属性
我的应用程序读取使用以下格式创建的JSON文件:C# 自定义JSON序列化/反序列化以多种可能的格式读取属性,c#,json,json.net,C#,Json,Json.net,我的应用程序读取使用以下格式创建的JSON文件: { "myProperty": {complex JSON here} } class-MyClass { 公共MyChildClass MyProperty{get;set;} } 我需要改变类的工作方式,使其看起来像这样: class-MyClass { 公共MyNewChildClass MyNewProperty{get;set;} } 我需要能够支持以旧格式创建的文件,但也支持使用新格式创建的文件 我有将MyChildClas
{
"myProperty": {complex JSON here}
}
class-MyClass
{
公共MyChildClass MyProperty{get;set;}
}
我需要改变类的工作方式,使其看起来像这样:
class-MyClass
{
公共MyNewChildClass MyNewProperty{get;set;}
}
我需要能够支持以旧格式创建的文件,但也支持使用新格式创建的文件
我有将
MyChildClass
对象转换为MyNewChildClass
对象的代码,但是如何设置序列化,以便该对象可以反序列化旧格式,将属性名称和类型从MyChildClass MyProperty
更改为MyNewChildClass MyNewProperty
,并在使用新格式进行序列化和反序列化时使用新格式(如果这是JSON文件包含的格式)?如果同时使用这两个属性,JSON将同时适用于新旧属性
class MyClass
{
[JsonPropert("myProperty")]
public MyChildClass MyProperty {get; set;}
[JsonProperty("myNewProperty")] // -> Remember, case matters.
public MyNewChildClass MyNewProperty {get; set;}
}
当您反序列化这个类时,添加一个检查来查看哪个不是null,并使用它(我猜每个都有不同的方法)。这将有助于您将中断的更改保持在最低限度
顺便说一句>。如果您有将新代码转换为旧代码或将旧代码转换为新代码的代码,则可以检查old的值是否为null,然后运行必须将新代码转换为旧代码的进程/方法,并继续处理对象。记住,它必须在反序列化之后
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.
}
var properties=JsonConvert.DeserializeObject(“数据”);
if(properties.MyNewProperty==null)
{
属性=myMethodToConvertOldToNew(属性);
}
公共MyClass myMethodToConvertOldToNew(MyClass)
{
如果(properties.New==null)
{
properties.New=ConversionMethod(properties.Old,properties.New);
//不必,但是,
properties.Old=null;
}
返回属性。
}
为什么不在类中添加一个私有属性来设置新属性:
class MyClass
{
[JsonProperty]
private MyChildClass MyProperty { set => MyNewProperty = YourConversionMethod(value); }
public MyNewChildClass MyNewProperty { get; set; }
}
JsonProperty
属性将确保使用私有setter。添加这两个属性。。。。如果某个属性丢失。它将被设置为空值