Дезициализация свойств самореференции не работает

У меня есть этот объект с свойством Родитель, который ссылается на другой объект того же типа:

[JsonObject(IsReference = true)] class Group { public string Name { get; set; } public Group(string name) { Name = name; Children = new List(); } public IList Children { get; set; } public Group Parent { get; set; } public void AddChild(Group child) { child.Parent = this; Children.Add(child); } } 

Сериализация работает отлично и приводит к тому, что json выглядит следующим образом:

 { "$id": "1", "Name": "Parent", "Children": [ { "$id": "2", "Name": "Child", "Children": [], "Parent": { "$ref": "1" } } ], "Parent": null } 

Но десериализация не работает. Свойство Parent возвращается null.

Тест выглядит следующим образом:

 [Test] public void Test() { var child = new Group("Child"); var parent = new Group("Parent"); parent.AddChild(child); var json = JsonConvert.SerializeObject(parent, Formatting.Indented); Debug.WriteLine(json); var deserializedParent = (Group) JsonConvert.DeserializeObject(json, typeof(Group)); Assert.IsNotNull(deserializedParent.Children.First().Parent); } 

Что я делаю не так? Любая помощь ценится!

Использование ссылок не работает с объектами, у которых есть только конструкторы с параметрами.

Json.NET должен десериализовать все дочерние значения до того, как он создаст родительский элемент, ему необходимо передать эти значения в конструктор, поэтому для назначения дочернего элемента не существует допустимой родительской ссылки.

Чтобы расширить ответ Джеймса, вы можете исправить эту проблему, предоставив конструктор без параметров (по умолчанию) для использования Json.Net. Он может быть закрытым, если вы хотите, если вы также отмечаете его атрибутом [JsonConstructor] .

 [JsonObject(IsReference = true)] class Group { ... [JsonConstructor] private Group() { } public Group(string name) { Name = name; Children = new List(); } ... } 

Эта компоновка позволяет Json.Net создавать объект, не требуя всей информации впереди; он может затем использовать общедоступные свойства для заполнения вещей в дальнейшем.

Сценарий: https://dotnetfiddle.net/QfqV43

  • Сериализовать контейнер перечислений в виде строк с помощью JSON.net
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Как я могу разбирать JSON с C #?
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Как сообщить Json.Net глобально применить StringEnumConverter ко всем enumsм
  • Конвенция о присвоении имен JSON
  • Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1
  • Json.Net - Сериализовать имя свойства без кавычек
  • Удаление десериализации полиморфных classов json без информации о типе с использованием json.net
  • Ошибка при запуске JSON.NET при сериализации Mongo ObjectId
  • Отключить classы JSON до C #
  • Давайте будем гением компьютера.