9

我有一些 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 设置“雇主”参考?我尝试使用 a CustomCreationConverter,但该public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)方法不包含对当前父对象的任何引用。

4

3 回答 3

2

如果您尝试将其作为反序列化的一部分,那只会让您头疼。反序列化后执行该任务会容易得多。执行以下操作:

var company = //deserialized value

foreach (var employee in company.employees)
{
    employee.employer = company;
}

或者单行,如果您更喜欢语法:

company.employees.ForEach(e => e.employer = company);
于 2013-05-08T10:36:49.453 回答
1

我通过在父类中定义一个“回调”来处理类似的情况,如下所示:

    [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 库引用。

于 2021-03-25T13:48:06.663 回答
-2

Json.net 使用 PreserveReferencesHandling 解决了这个问题。只需设置 PreserveReferencesHandling = PreserveReferencesHandling.Objects,Newtonsoft 就会为您完成这一切。

https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_PreserveReferencesHandling.htm

问候,法比亚努斯

于 2020-06-01T16:24:55.883 回答