Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义JSON序列化/反序列化以多种可能的格式读取属性_C#_Json_Json.net - Fatal编程技术网

C# 自定义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

我的应用程序读取使用以下格式创建的JSON文件:

{
  "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。

添加这两个属性。。。。如果某个属性丢失。它将被设置为空值