使用继承反序列化JSON

时间:2015-07-13 23:01:18

标签: c# json inheritance json.net

我有一个类型Person,它包含一组额外的人员:

public class Person {
  public String FirstName { get; set; }
  public String LastName { get; set; }
  public int Age { get; set; }
  public List<Person> Children { get; internal set; }

  public Person(Person parent)
  {
    if (parent != null) {
      this.LastName = parent.LastName;
    }
  }
}

我想使用NewtonSoft库从JSON反序列化。

{
    FirstName: "George",
    LastName: "Jetson",
    Age: 37,
    Children: [{
        FirstName: "Elroy",
        Age: 7
    }]
}

Elroy的姓氏应该从该外部对象继承。我这样反序列化:

var jetsons = JsonConvert.Deserialize<Person>(json);

但是Elroy的构造函数传递了一个null,因此没有设置他的姓氏。

如何让反序列化器将父对象作为参数传递给子代的构造函数?

1 个答案:

答案 0 :(得分:3)

只需将您的Person类更改为

即可
public class Person
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public int Age { get; set; }
    public List<Person> Children { get; set; } //<== public setter
} 

并反序列化为

var person = JsonConvert.DeserializeObject<Person>(json);

这就是......

PS:当然我假设你使用了一个有效的json。 (例如FirstName: "George"代替FirstName: George

修改 正如 @Preston-Guillot 所述,将 LastName 设置为其父级的姓氏是您的业务规则,与您的json的反序列化无关。

您可以使用递归代码在反序列化后重新排列LastNames,如下所示:

var person = JsonConvert.DeserializeObject<Person>(json);

string currLastName = null;
Action<Person> setLastNames = null;
setLastNames = p => {
    currLastName = p.LastName;
    if (p.Children != null) p.Children.ForEach(c => { if (c.LastName == null)  c.LastName = currLastName; });
    if (p.Children != null) p.Children.ForEach(c => setLastNames(c));
};
setLastNames(person);