我有一些JSON,如:
{
"companyName": "Software Inc.",
"employees": [
{
"employeeName": "Sally"
},
{
"employeeName": "Jimmy"
}
]
}
我想将其反序列化为:
public class Company
{
public string companyName { get; set; }
public IList<Employee> employees { get; set; }
}
public class Employee
{
public string employeeName { get; set; }
public Company employer { get; set; }
}
如何让JSON.NET设置“雇主”参考?我尝试使用CustomCreationConverter
,但public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
方法不包含对当前父对象的任何引用。
答案 0 :(得分:1)
如果您尝试将其作为反序列化的一部分,那么这只会让您感到头痛。在反序列化之后执行该任务会容易得多。做类似的事情:
var company = //deserialized value
foreach (var employee in company.employees)
{
employee.employer = company;
}
如果你更喜欢语法,那就是单行:
company.employees.ForEach(e => e.employer = company);
答案 1 :(得分:0)
我通过在父类中定义一个“callback”来处理类似的情况,如下所示:
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
// Add logic here to pass the `this` object to any child objects
}
这适用于 JSON.Net,无需任何其他设置。我实际上并不需要 StreamingContext
对象。
在我的例子中,子对象有一个 SetParent()
方法,在此处以及以其他方式创建新子对象时都会调用该方法。
[OnDeserialized]
来自 System.Runtime.Serialization
,因此您无需添加 JSON 库引用。
答案 2 :(得分:-1)
Json.net通过PreserveReferencesHandling解决了这一问题。只需设置PreserveReferencesHandling = PreserveReferencesHandling.Objects,Newtonsoft即可为您完成所有工作。
https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_PreserveReferencesHandling.htm
关于, 法比安努斯