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

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

[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

  • Десериализация дат с форматом dd / mm / yyyy с использованием Json.Net
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Как я могу разобрать строку JSON, которая приведет к незаконным идентификаторам C #?
  • Как сериализовать словарь как часть его родительского объекта с помощью Json.Net
  • Json.net сериализует определенное частное поле
  • Как игнорировать свойство в classе, если null, используя json.net
  • Использование пользовательской десериализации тела WCF без изменения десериализации шаблона URI
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • JSON.NET как сериализатор OAP для WebAPI 2 и ODataMediaTypeFormatter
  • Как вернуть объект JSon
  • Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?
  • Interesting Posts

    Установить inputType для EditText?

    Загрузите изображение с камеры или галереи в WebView

    Рекомендации по док-станции WPF

    Составляют ли какие-либо JIT-компиляторы JVM код, который использует векторизованные инструкции с плавающей запятой?

    Источники питания для ноутбуков, текущие вопросы?

    Как считать все строки кода в каталоге рекурсивно?

    Создание XML с использованием SAX и Java

    Решение Deeplink для приложений IOS и Android работает в Facebook

    Почему Disk Utility / diskutil занимает так много времени, чтобы обнулить данные?

    Создайте программу установки для приложений C # и включите установщик .NET Framework в настройку

    Какова цель выражения «new String (…)» в Java?

    Как я могу горизонтально выровнять свои div?

    Решение о том, когда использовать XmlDocument vs XmlReader

    Контроль доступа в ASP.NET MVC в зависимости от входных параметров / уровня обслуживания?

    Программное обеспечение для телефона для ПК

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