Использование JavaScript для десериализации ссылок в графе сложных объектов из SignalR / Json.NET
Я использую SignalR для возврата графа сложных объектов в мой клиент JavaScript. Этот граф объектов имеет несколько ссылок на один и тот же объект, поэтому JSON, который возвращает SignalR / Json.NET, выглядит примерно так:
{
"$id": "57",
"Name": "_default",
"User": {
"$id": "58",
"UserTag": "ken",
"Sessions": [{
"$id": "59",
"SessionId": "0ca7474e-273c-4eb2-a0c1-1eba2f1a711c",
"User": {
"$ref": "58"
},
"Room": {
"$ref": "57"
}
}],
},
"Sessions": [{
"$ref": "59"
}]
}
(Конечно, намного сложнее в реальной жизни, но вы поняли.)
И, конечно, когда Json.NET сериализуется по ссылке, а не по значению, он присваивает каждому объекту значение $ id (например,"$id":"57"
и затем позже просто ссылается на этот объект, используя этот идентификатор (например,"$ref":"57"
, И, насколько я могу судить, когда Json.NET (использующий C # /. NET) десериализует эти ссылки, он помещает соответствующие экземпляры объекта в соответствующие места.
Пока все хорошо - но как лучше всего десериализовать этив JavaScript, так что я на самом деле получаю соответствующие экземпляры объекта в соответствующих местах, а не просто странные поля $ ref?
Вероятно, я мог бы написать свой собственный универсальный десериализатор, но я должен представить, что кто-то другой уже решил эту проблему, и я просто не буду изобретать какие-либо колеса. К сожалению, моих навыков работы с Google явно недостаточно, чтобы найти это решение :-).
Редактировать:
Я вижу, что естьIETF проект предложения о том, как такого рода вещи должны работать. И похоже, что всегда полезный Дуглас Крокфорд имеетпредварительная реализация этого К сожалению, в предложении IETF используется другая схема, чем в Json.NET.