JSON 来自 schema.org 的 LD 序列化

JSON LD serialization from schema.org

下面的例子是在json-ld playground.

上给出的

人物示例(扩展):

json-ld:

{
  "@context": "http://schema.org/",
  "@type": "Person",
  "name": "Jane Doe",
  "jobTitle": "Professor",
  "telephone": "(425) 123-4567",
  "url": "http://www.janedoe.com"
}

序列化扩展后:

[
  {
    "@type": [
      "http://schema.org/Person"
    ],
    "http://schema.org/jobTitle": [
      {
        "@value": "Professor"
      }
    ],
    "http://schema.org/name": [
      {
        "@value": "Jane Doe"
      }
    ],
    "http://schema.org/telephone": [
      {
        "@value": "(425) 123-4567"
      }
    ],
    "http://schema.org/url": [
      {
        "@id": "http://www.janedoe.com"
      }
    ]
  }
]

我问自己序列化程序从哪里获取信息以将属性映射到正确的后续模式 (name)。为此,它必须能够掌握 person json ld 模式。但是如果我去 https://schema.org/Person 我得到一个 HTML 而不是 JSON-LD 文件。

那么连载知识从何而来?

周杰伦的知识来自@context是正确的。这可以通过几种方式指定:

  • 内联,使用 @context 的 object 值(或包含 object 的数组),

  • 通过直接从指定的 URL 检索上下文(例如,https://json-ld.org/contexts/person.jsonld),

  • 通过让服务器对请求执行 context-negotiation,因为 HTTP 请求包含 Accept header 偏好 JSON-LD(参见 Interpreting JSON as JSON-LD) 例如:

    GET /ordinary-json-document.json HTTP/1.1
    Host: example.com
    Accept: application/ld+json,application/json,*/*;q=0.1
    
  • 或者,正如目前由 schema.org 部署的那样,通过返回一个 Link header 以及一个 GET 或 HEAD 请求来标识实际上下文的位置加载(参见 Alternate Document Location):

    HTTP/1.1 200 OK
    ...
    Content-Type: text/html
    Link: <alternate.jsonld>; rel="alternate"; type="application/ld+json"
    

    由于使 HTTP Content-Negotiation 在某些静态站点生成器上正常工作的挑战,schema.org 使用了最后一个案例。如果您在 https://schema.org 发送 HEAD 请求,您将返回 headers,包括以下内容:

HTTP/2 200 
link: </docs/jsonldcontext.jsonld>; rel="alternate"; type="application/ld+json"

符合规范的 JSON-LD 处理器(例如 json-ld.org 游乐场)知道遵循此 link 以找到实际上下文。

在 Person 示例中,“Person”和其他键根据上下文文件中的指令转换为 IRI,如下所示:

{
  "@context": {
    ...
    "schema": "http://schema.org/",
    "Person": {"@id": "schema:Person"},
    "name": { "@id": "schema:name"},
    "jobTitle": { "@id": "schema:jobTitle"},
    "telephone": { "@id": "schema:telephone"},
    "url": { "@id": "schema:url", "@type": "@id"},
    ...
  }
}

请注意,在“url”的情况下,它还知道 属性 的值应被视为 IRI,而不是文本字符串。