自定义JSON序列化/反序列化,以多种可能的格式读取属性

时间:2019-12-10 14:07:00

标签: c# json json.net

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

{
  "myProperty": {complex JSON here}
}
class MyClass
{
   public MyChildClass MyProperty {get; set;}
}

我需要更改类的工作方式,以使它看起来像这样:

class MyClass
{
   public MyNewChildClass MyNewProperty {get; set;}
}

,而且我需要能够支持以旧格式创建的文件,而且还必须支持使用新格式创建的文件。

我有将MyChildClass对象转换为MyNewChildClass对象的代码,但是如何设置序列化,以便该对象可以反序列化旧格式,从而更改属性名称和类型MyChildClass MyPropertyMyNewChildClass MyNewProperty并在序列化时使用新格式,如果JSON文件包含该格式,则使用新格式反序列化?

2 个答案:

答案 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属性将确保使用私有设置器。