用继承反序列化JSON

本文关键字:JSON 反序列化 继承 | 更新日期: 2023-09-27 18:02:42

我有一个类型Person,它包含一个额外的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的构造函数得到一个传递给它的空值,因此没有得到他的姓。

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

用继承反序列化JSON

只需将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);