Аннотирование вложенных структур/значений в JSON-LD

Скажем, у меня есть объект JSON с некоторыми свойствами во вложенном объекте.

{
    "title": "My Blog Post",
    "meta": {
        "publishedAt": "2016-08-01T00:00:00Z"
    }
}

Есть ли простой способ просто добавить @context к моему объекту верхнего уровня, чтобы получить доступ к этим свойствам (т.е. просто «пройти» через метаобъект)? Что-то в этом роде:

{
    "@context": {
        "title": "schema:name",
        "meta.publishedAt": {
            "@type": "xsd:date",
            "@id": "schema:datePublished"
        }
    },

    "@id": "/my-article",
    "title": "My Blog Post",

    "meta": {
        "publishedAt": "2016-08-01T00:00:00Z"
    }
}

Я хотел бы избежать необходимости добавлять (дублировать) @id к вложенному объекту, как я бы в противном случае решил это:

{
    "@context": {
        "title": "schema:name",
        "meta": { "@id": "_:meta", "@container": "@set" },
        "publishedAt": {
            "@type": "xsd:date",
            "@id": "schema:datePublished"
        }
    },

    "@id": "/my-article",
    "title": "My Blog Post",

    "meta": {
        "@id": "/my-article",
        "publishedAt": "2016-08-01T00:00:00Z"
    }
}

Это решение работает, но требует дублирования и взято из комментарии ethanresnick на Github об аннотировании JSON API. В другой проблеме он отметил, что @context "не совсем достаточно выразительным, чтобы аннотировать структуру JSON API». Я надеялся доказать его неправоту хотя бы в этом вопросе.


person vicvicvic    schedule 10.08.2016    source источник
comment
Если вы просто определили термин publishedAt, он будет работать для всех экземпляров (но вы, вероятно, хотите xsd:dateTime, а не xsd:date).   -  person Gregg Kellogg    schedule 13.08.2016
comment
Если то, что вы пытаетесь сделать, это съесть элемент meta, то нет, это невозможно сделать в JSON-LD.   -  person Gregg Kellogg    schedule 13.08.2016
comment
@GreggKellogg Спасибо! Вы правы насчет xsd:dateTime конечно. Мне грустно это слышать. Если вы опубликуете свой комментарий в качестве ответа, я отмечу его принятым :)   -  person vicvicvic    schedule 14.08.2016


Ответы (2)


Я только что обнаружил, что последняя спецификация JSON-LD включает новый раздел на вложенные свойства. Такое определение контекста должно привести к желаемому результату:

{
    "@context": {
        "title": "schema:name",
        "meta": "@nest",
        "publishedAt": {
            "@type": "xsd:date",
            "@id": "schema:datePublished",
            "@nest": "meta"
        }
    },
    ...
}
person cbst    schedule 18.04.2017
comment
Фантастическая новость! Читая спецификацию, разве вам не нужно включать "meta": "@nest" в @context? - person vicvicvic; 19.04.2017

Если то, что вы пытаетесь сделать, это съесть метаэлемент, то нет, это невозможно сделать в JSON-LD.

Были дискуссии о создании обратного индекса, который мог бы делать что-то подобное, но я не вижу проблемы. Вы можете создать его по адресу https://github.com/json-ld/json-ld.org/issues. В какой-то момент CG или вновь сформированная рабочая группа начнут рассматривать запросы на добавление функций в новую версию.

person Gregg Kellogg    schedule 15.08.2016