解析版本化的JSON

时间:2014-04-23 15:07:36

标签: c# json oop design-patterns deserialization

我有两个不同的Jsons代表的对象:

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的请求来了。处理这个问题的最佳解决方案是什么?

我有一个想法,就是制作接口列表(因为属性名称总是存在),并为它做多个实现,每个版本一个。

1 个答案:

答案 0 :(得分:0)

我没有看到任何需要接口来解决这个问题。

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

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

请注意?类型后面的int,这意味着该属性可以为null。使用Json.NET,如果将v1 JSON反序列化到此类中,name将按预期填充,age将保持为空。

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