У меня есть дважды связанный список, который я пытаюсь десериализовать.
Мой сценарий тесно связан с этим SO: Двуединый список для JSON
У меня есть следующие настройки JSON:
_jsonSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ObjectCreationHandling = ObjectCreationHandling.Auto
};
Когда я смотрю на сериализованный вывод, он выглядит правильно, и ссылки между узлами должным образом представлены.
Когда данные десериализованы, свойства родителя в объектах Child имеют значение NULL, хотя они правильно заполнены значением $ref.
Ниже приведен образец JSON (обрезанный для удобства чтения)
В процессе ввода этого вопроса - я, возможно, видел источник проблемы...
Объекты в массиве "Дети" не имеют атрибутов $type.
Это может быть связано с тем, что свойства "Дети" и "Родитель" имеют общий тип T.
Обратите внимание, что фактический тип, который является сериализованным, является производным классом TemplateDataLinkedListBase
public class TemplateDataQueryElement : TemplateDataLinkedListBase<TemplateDataQueryElement>
Вот отрывок базового класса:
public class TemplateDataLinkedListBase<T> where T : TemplateDataLinkedListBase<T>
{
[JsonProperty(TypeNameHandling = TypeNameHandling.Objects)]
public T Parent { get; set; }
[JsonProperty(TypeNameHandling=TypeNameHandling.Objects)]
public List<T> Children { get; set; }
}
Как я могу десериализовать этот JSON таким образом, чтобы свойство Parent не было null и содержит ссылку на родительский объект?
{
"$id": "9",
"$type": "Contracts.Models.TemplateDataQueryElement, Contracts",
"Query": null,
"Parent": null,
"Children": [
{
"$id": "11",
"Query": null,
"Parent": {
"$ref": "9"
},
"Children": [
{
"$id": "13",
"Query": null,
"Parent": {
"$ref": "11"
},
"Children": [],
"EntityName": "Widgets",
"Fields": [
"Id"
],
"Key": ""
},
Вот ссылки PasteBin на соответствующий код:
http://pastebin.com/i1jxVGG3 http://pastebin.com/T1xqEWW2 http://pastebin.com/ha42SeF7 http://pastebin.com/cezwZqx6 http://pastebin.com/uFbTbUZe http://pastebin.com/sRhNQgzh