
Недавно обновилась спецификация по JSON Linked Data. Я думаю что все знаю что такое JSON, но если вы хотите узнать что же за новое расширение придумали для JSON в W3C то добро пожаловать под кат.
Что же такое LD(Linked Data)
Согласно
- Использовать URIs для именования сущностей.
- Использовать HTTP URIs так чтобы люди могли находить эти сущности.
- Когда кто-то ищет URI, предоставлять полезную информацию используя стандарты (RDF*, SPARQL)
- Включать ссылки на остальные URIs чтобы они могли открывать больше сущностей.
Формат JSON-LD используется для семантического представления связанных данных.
Визуальное представление Linked Data это граф

Хороший пример реализации Linked Data это DBPedia
Также GMail уже поддерживает формат в разметке почты.
Отличия от JSON синтаксиса
JSON-LD по основному синтаксису идентичен JSON, и он будет всегда проходить JSON валидацию, основное отличие это зарезервированные ключи в JSON объекте для семантического разбора данных.
Примеры
Пример из спецификации, создаем структуру представляемых данных через ключ context, и вводим наши данные.
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
}
},
"name": "John Doe",
"homepage": "http://example.org/"
}
Контекст можно задавать через ссылку на файл с контекстом.
{
"@context": "http://json-ld.org/contexts/person.jsonld",
"name": "John Doe",
"homepage": "http://example.org/"
}
После раскрытия URI с контекстом данные будут выглядеть так:
[{
"http://xmlns.com/foaf/0.1/homepage": [
{
"@id": "http://example.org/"
}],
"http://xmlns.com/foaf/0.1/name": [
{
"@value": "John Doe"
}]
}]
Так же на сайте сообщества есть небольшой playground с примерами.
Зарезервированные ключи
- context
Определяет структуру предоставляемых данных, а именно ключи и типы значений к ключам(IRI).
Все типы IRIs можно посмотреть тут.
- id
Используется для определения уникального имени для сущности. В структуре данных сущность это узел графа.
- value
Используется для определения данных для введенных ключей.
- language
Определяет язык предоставленных данных.
{ "@context": { ... "@language": "ru" }, "name": "Джон До", "occupation": "Разработчик" }
- type
Определяет тип узла или типизированного значения.
- container
Выставляем тип контейнера для нашего ключа.
{ "@context": { ... "nick": { "@id": "http://xmlns.com/foaf/0.1/nick", "@container": "@list" } }, ... "@id": "http://example.org/people#joebob", "nick": [ "joe", "bob", "jaybee" ], ... }
- list
Контейнер данных, в JSON представлен массивом.
["obj1","obj2","obj3"]
- set
Контейнер данных, в JSON представлен как объект ключ значение.
{ "@id": "data" }
- reverse
Добавляет общий ключ для узлов графа, этот ключ будет родительским для узлов которые вписаны внутри reverse.
Пример добавление ключа без reverse
[ { "@id": "#homer", "http://example.com/vocab#name": "Homer" }, { "@id": "#bart", "http://example.com/vocab#name": "Bart", "http://example.com/vocab#parent": { "@id": "#homer" } }, { "@id": "#lisa", "http://example.com/vocab#name": "Lisa", "http://example.com/vocab#parent": { "@id": "#homer" } } ]
В случае если использовать reverse то мы получим более удобную структуру.
{ "@id": "#homer", "http://example.com/vocab#name": "Homer", "@reverse": { "http://example.com/vocab#parent": [ { "@id": "#bart", "http://example.com/vocab#name": "Bart" }, { "@id": "#lisa", "http://example.com/vocab#name": "Lisa" } ] } }
- index
Вид контейнера который представлен как произвольные структуры ключ значение. Тут используется прямой доступ к данным без определения структуры в контексте.
{ "@context": { "schema": "http://schema.org/", "name": "schema:name", "body": "schema:articleBody", "words": "schema:wordCount", "post": { "@id": "schema:blogPost", "@container": "@index" } }, "@id": "http://example.com/", "@type": "schema:Blog", "name": "World Financial News", "post": { "en": { "@id": "http://example.com/posts/1/en", "body": "World commodities were up today with heavy trading of crude oil...", "words": 1539 }, "de": { "@id": "http://example.com/posts/1/de", "body": "Die Werte an Warenbörsen stiegen im Sog eines starken Handels von Rohöl...", "words": 1204 } } }
- base
Определяет основной URL для IRI с относительными путями.
- vocab
Определяет словарь который расширяет типы для ключа type.
{ "@context": { "@vocab": "http://schema.org/" } "@id": "http://example.org/places#BrewEats", "@type": "Restaurant", "name": "Brew Eats" ... }
- graph
Иногда нужно присоединить не узел а полный граф как объект и для этого используется данный ключ. Тут граф передается как группа узлов.
{ "@context": { "generatedAt": { "@id": "http://www.w3.org/ns/prov#generatedAtTime", "@type": "http://www.w3.org/2001/XMLSchema#date" }, "Person": "http://xmlns.com/foaf/0.1/Person", "name": "http://xmlns.com/foaf/0.1/name", "knows": "http://xmlns.com/foaf/0.1/knows" }, "@id": "http://example.org/graphs/73", "generatedAt": "2012-04-09", "@graph": [ { "@id": "http://manu.sporny.org/about#manu", "@type": "Person", "name": "Manu Sporny", "knows": "http://greggkellogg.net/foaf#me" }, { "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://manu.sporny.org/about#manu" } ] }
P.S.
Формат данных очень интересен, и нужно еще много изучить в его структуре и принципах раскрытия и записи данных, будем надеяться что браузеры сделают более плотную интеграцию с JSON-LD в будущем.
Дополнительные материалы по JSON-LD
JSON-LD Community
JSON-LD API
JSON-LD Syntax
JSON-LD Framing
JSON-LD Normalization
Небольшая презентация от одного из авторов спецификации
JSON-LD на github