Я использую 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(используя С#/. NET) десериализует эти ссылки, он помещает соответствующие экземпляры объекта в соответствующие места.
Все хорошо до сих пор - но какой лучший способ десериализовать их в JavaScript, чтобы на самом деле получить соответствующие экземпляры объектов в соответствующих местах, а не просто странные поля $ref?
Я мог бы, вероятно, написать свой собственный универсальный десериализатор, но я должен представить, что кто-то еще уже справился с этой проблемой, и я бы не стал изобретать все колеса. К сожалению, моих навыков Google, по-видимому, недостаточно для определения этого решения: -).
Edit:
Я вижу, что существует проект проекта IETF о том, как это должно работать. И похоже, что всегда полезный Douglas Crockford имеет предварительную реализацию. К сожалению, предложение IETF использует другую схему, чем использует Json.NET.