用继承反序列化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的构造函数得到一个传递给它的空值,因此没有得到他的姓。
如何让反序列化器将父对象作为参数传递给子构造函数?
只需将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);