我有一个类型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,因此没有设置他的姓氏。
如何让反序列化器将父对象作为参数传递给子代的构造函数?
答案 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);