C# 解析版本化JSON

C# 解析版本化JSON,c#,json,oop,design-patterns,deserialization,C#,Json,Oop,Design Patterns,Deserialization,我有两个不同的JSON表示的对象: JSON v1: { "names":[{"name":John},{"name":Eve}], "version": 1 } JSON v2: { "names":[{"name":"John", "age":22},{"name":"Eve", "age":35}], "version": 2 } 现在我有了一个可以解析Json第一个版本的类: [JsonObject("Class")] public class PeopleEntity

我有两个不同的JSON表示的对象:

JSON v1:

{
 "names":[{"name":John},{"name":Eve}],
 "version": 1
}
JSON v2:

{
  "names":[{"name":"John", "age":22},{"name":"Eve", "age":35}],
  "version": 2
}
现在我有了一个可以解析Json第一个版本的类:

[JsonObject("Class")]
public class PeopleEntity
{
    public string name{ get; set; }
}

public class People
{
  public List<PeopleEntity> names{ get; set; }
  public string version{ get; set; }

}
这就是它的解析方式:

  result = JsonConvert.DeserializeObject<People>(json_data, new     JsonSerializerSettings
                        {
                            DefaultValueHandling = DefaultValueHandling.Ignore
                        });
现在的问题是,解析JSON第二个版本的请求出现了。处理这个问题的最佳解决方案是什么


我有一个想法,因为属性名总是存在,所以我可以列出接口列表,并对其进行多个实现,每个版本一个。

我认为没有必要使用接口来解决这个问题

如果要将两个版本的JSON反序列化为同一类型,可以向PersonEntity添加可为null的age属性,如下所示:

[JsonObject("Class")]
public class PeopleEntity {
    public string name { get; set; }
    public int? age { get; set; }
}
注意到了吗?在int类型之后,这意味着属性可以为null。使用Json.NET,如果将v1 Json反序列化到此类中,名称将按预期填充,并且年龄将保持为null


或者,由于您知道要预先反序列化哪个版本的JSON,因此可以为每个版本使用不同的类型。使用v1的现有PeopleEntity类型,创建一个派生类,为v2添加一个age属性。

好吧,这当然是所用json实现的问题。如果你自己动手,答案很简单,但那可能太疯狂了。那么您使用哪个JSON库呢?你能/愿意改变吗?许多库提供将字符串反序列化到字典。然后您可以检查字典,查看版本并选择相应的DTO类,然后可以从字典中水合。@mnemosyn我使用了Newtonsoft库。我无法更改输入的json。在解析json之前,我知道它的版本,它位于文件名中。如果您事先知道该版本,有什么问题?只需序列化到正确的DTO类。在反序列化过程中,拥有两个类比处理奥术逻辑更容易。保持序列化简单,稍后再进行转换,这是低耦合。