Стандартный способ ссылки на объект по идентичности (например, для круговых ссылок)?
Есть ли стандартный способ ссылки на объекты по идентификатору в JSON? Например, чтобы графы и другие структуры данных с большим количеством (возможно, круговых) ссылок могли быть сериализованы/загружены?
Изменить. Я знаю, что легко сделать одноразовые решения ( "составить список всех узлов в графе, затем..." ). Мне интересно, есть ли стандартное, общее, решение этой проблемы.
Ответы
Ответ 1
Недавно я искал эту функцию. Кажется, что стандартная или повсеместная реализация для ссылок в JSON не существует. Я нашел пару ресурсов, которыми я могу поделиться:
- Будущее для привязки JSON
http://groups.google.com/group/json-schema/browse_thread/thread/95fb4006f1f92a40 - Это просто обсуждение ссылок на основе id.
http://www.sitepen.com/blog/2008/06/17/json-referencing-in-dojo/ - реализация в Dojox (расширения для фреймворка Dojo) - обсуждает ссылки на основе на основе и на основе пути,
- JSONPath - XPath для JSON
http://goessner.net/articles/JsonPath/ - Кажется, это попытка установить стандарт для ссылки на JSON на основе пути - возможно, небольшое подмножество XPath (?). Кажется, здесь есть реализация, но я продолжал получать ошибки в разделе загрузки - вам может быть повезло больше. Но опять же это не тот, где рядом со стандартом.
Ответ 2
Существует "Спецификация JSON Reference" , но, похоже, она не попала в состояние истекшего интернет-проекта.
Тем не менее, похоже, он используется в схеме JSON и Swagger (теперь OpenAPI) (для повторного использования частей описания API в других местах того же или другого описания API).
Ссылка на объект в том же файле выглядит следующим образом: { "$ref": "#/definitions/Problem" }
.
Ответ 3
У Дугласа Крокфорда есть решение, в котором используется JSONPath (синтаксис Xpath для описания путей json). Это кажется вполне нормальным:
https://github.com/douglascrockford/JSON-js/blob/master/cycle.js
Ответ 4
Канонического способа добиться этого не существует. JSON не имеет встроенной поддержки ссылок, поэтому вам нужно изобрести свою собственную схему для уникальных идентификаторов, которые будут выступать в качестве указателей. Если вы действительно хотите сделать его общим, вы можете использовать идентификаторы объектов, предоставленные вашим языком программирования (например, object_id
в Ruby или id(obj)
в Python).