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

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

[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

  • Строка Parse Json в C #
  • Как вернуть объект JSon
  • Информация о сериализации типов кеша Json.NET?
  • JSON.Net Xml Сериализация неправильно понимает массивы
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Конвенция о присвоении имен JSON
  • Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Сериализация типа Json.Net с полиморфным дочерним объектом
  • как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Interesting Posts

    Применить форматирование валюты к UITextField в событии изменения

    UnityWebRequest Встраивание данных пользователя + пароль для HTTP Basic Authentication, не работающих на Android

    Получение java.net.SocketTimeoutException: время ожидания подключения в android

    Аспектно-ориентированное программирование в C #

    Два интернет-соединения, одна локальная сеть – как поделиться?

    Получите IPrincipal от токена носителя OAuth в OWIN

    Проблемы с шаблоном Singleton

    Как установить / удалить cookie с помощью jQuery?

    прохождение 2 $ индексных значений внутри вложенного ng-repeat

    Конфигурирование истории файлов Windows 8 / 8.1 / 10 с помощью командной строки

    Почему Mockito не издевается над статическими методами?

    Как установить язык по умолчанию в Notepad ++

    Какова относительная разница в производительности if / else по сравнению с оператором switch в Java?

    Как мне зашифровать всю файловую систему Linux с помощью Veracrypt?

    Перетащите DLL в GAC («assembly») на сервере Windows 2008 .net 4.0

    Давайте будем гением компьютера.