JSON-LD 语法基础

JSON-LD 保留 JSON 的基本结构,但引入一组以 @ 开头的关键字。它们不是普通业务字段,而是告诉处理器如何解释数据。

基本骨架

{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://example.com/people/ada",
  "name": "Ada Chen",
  "jobTitle": "前端工程师"
}
字段 作用
@context 定义字段和类型来自哪里
@type 声明当前对象的类型
@id 声明当前实体的稳定标识
name 普通属性,由上下文映射到完整语义

对象类型

@type 可以是一个字符串,也可以是数组:

{
  "@context": "https://schema.org",
  "@type": ["Person", "Author"],
  "name": "Ada Chen"
}

在 Schema.org 场景中,通常使用最贴近页面内容的一个类型即可。多类型更适合知识图谱或内部数据整合。

稳定标识符

@id 表示实体身份。多个文档中出现同一个 @id,可以被理解为同一个实体。

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Docs",
  "url": "https://example.com"
}

常见做法:

  • 页面主体:使用页面规范 URL。
  • 站点组织:使用首页 URL 加片段,例如 https://example.com/#organization
  • 作者:使用作者主页 URL。
  • 商品:使用商品详情页 URL 或稳定商品 URI。

嵌套实体

JSON-LD 可以直接嵌套对象:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "语义化数据指南",
  "author": {
    "@type": "Person",
    "@id": "https://example.com/authors/ada",
    "name": "Ada Chen"
  }
}

如果同一个实体在多处出现,优先给它稳定 @id,减少歧义。

数组

多个作者、图片或面包屑项都可以使用数组:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "多人协作文章",
  "author": [
    { "@type": "Person", "name": "Ada Chen" },
    { "@type": "Person", "name": "Lin Zhou" }
  ]
}

值对象

当普通字符串不够表达语言、数据类型或方向时,可以使用值对象:

{
  "@context": "https://schema.org",
  "@type": "Book",
  "name": {
    "@value": "小王子",
    "@language": "zh-CN"
  }
}

@graph 用于在同一个文档中发布多个相互关联的实体:

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#org",
      "name": "Example Docs"
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "publisher": { "@id": "https://example.com/#org" },
      "url": "https://example.com"
    }
  ]
}

@graph 很适合站点级实体、页面实体和组织实体同时出现的场景。

JSON-LD 不是 JavaScript

application/ld+json 中必须是合法 JSON:

{
  "ok": true,
  "count": 3,
  "items": ["a", "b"]
}

不要写成:

{
  ok: true,
  count: 3,
  // JSON 中不能有注释
}

尾随逗号、单引号、未加引号的键名、注释和函数都会导致解析失败。