JSON-LD(JSON for Linked Data)是一种基于 JSON 格式的结构化数据标记语言,可以帮助搜索引擎和其他应用程序更好地理解网页内容。它的核心作用是通过语义化的标记,为网页内容添加机器可读的元数据,从而提升搜索引擎的理解能力、提升 SEO 表现优化搜索结果的展示效果,并支持语音搜索、AI 助手等技术。
什么是 JSON-LD?
JSON-LD 是一种基于 JSON 的格式,用于在网页中嵌入机器可读的数据。它的核心目标是通过语义化的标记,帮助搜索引擎和其他应用程序更好地理解网页内容。JSON-LD 的主要特点包括:
- 基于 JSON:语法简单,易于阅读和编写。
- 语义化标记:使用 Schema.org 的词汇表,明确描述数据的含义。
- 灵活性:支持嵌套、数组、多语言等复杂数据结构。
- 广泛应用:适用于 SEO、语音搜索、数据集成等多种场景。
搜索引擎通过爬虫抓取网页内容时,只能看到文本和 HTML 标签,但无法直接理解这些内容的含义。JSON-LD 通过明确的语义标记(如 Product、Person、FAQPage 等),告诉搜索引擎页面的内容类型和结构,从而更准确地匹配用户搜索意图。JSON-LD 还可以让搜索引擎在搜索结果中展示更丰富的信息(称为“富媒体片段”),例如评分、价格、库存、事件时间等。这种富媒体片段不仅更吸引用户眼球,还能直接回答用户的问题,减少用户点击次数。
JSON-LD 的基本语法
JSON-LD 是一种用来帮助机器理解网页内容的格式。它使用 JSON 语法,但增加了一些特殊的标记和结构来表示数据的意义。为了帮助你理解,我们可以先看看一个简单的 JSON-LD 示例:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "示例产品",
"description": "这是一个示例产品的描述。"
}
</script>
上面的代码可以嵌入到网页中。
具体说明:
<script type="application/ld+json">
标签:这行是告诉浏览器,这部分内容是 JSON-LD 数据,通常放在网页的<head>
标签内或其他合适的地方。@context
:这个关键字告诉 JSON-LD 你在使用什么标准或规则。这里我们使用的是 Schema.org,它是一个广泛认可的词汇库,用于描述各种网页内容的类型。@type
:这个关键字告诉搜索引擎你正在描述什么类型的内容。在这个例子中,我们定义的是一个“产品”(Product)。name
和description
:这些是具体的属性,描述产品的名称和描述。
JSON-LD 本质上是一种嵌入在网页中的数据格式,它不是网页的“可见内容”,而是帮助搜索引擎理解网页内容的“额外信息”。你可以把它想象成一个“后台标签”,它告诉搜索引擎这个页面是关于什么的。
一个典型的 JSON-LD 结构通常包含以下部分:
@context
:指向数据使用的标准或词汇库。@type
:定义数据的类型(如 Product、Event、Person 等)。- 属性(如
name
、price
、address
等):根据数据类型填写的具体内容。
JSON-LD 的核心关键字
JSON-LD 定义了一些核心关键字(以 @
开头),用于描述数据的结构和语义:
关键字 | 作用 |
---|---|
@context | 告诉 JSON-LD 使用的标准(例如 Schema.org)。 |
@type | 定义数据的类型(如产品、事件、人物等)。 |
@id | 提供数据的唯一标识符(可选)。 |
@value | 定义属性的具体值。 |
@language | 定义文本的语言(例如 en 表示英语)。 |
JSON-LD 的核心功能
1. JSON-LD 的数据类型和属性
JSON-LD 结构化数据基于 Schema.org 词汇表,支持大量 @type
类型。以下是常见的主要类别和子类别:
主要核心类型
类型 (@type ) | 描述 |
---|---|
Thing | 所有类型的基础类(所有类型都继承自 Thing ) |
CreativeWork | 任何创作的作品,如文章、书籍、电影、音乐等 |
Event | 事件,如音乐会、比赛、会议等 |
Intangible | 非实体事物,如品牌、货币、评分等 |
Organization | 组织,如公司、非盈利组织、学校等 |
Person | 个人或公共人物 |
Place | 地点,如城市、商店、景点等 |
Product | 产品或服务 |
Action | 用户行为,如购买、观看、评论等 |
子类别:文章 & 新闻
类型 (@type ) | 描述 |
---|---|
Article | 文章,通用类型 |
BlogPosting | 博客文章(适用于博客网站) |
NewsArticle | 新闻文章(适用于新闻网站) |
ScholarlyArticle | 学术论文 |
TechArticle | 技术文章,如 API 文档 |
Report | 报告、研究报告 |
子类别:组织 & 公司
类型 (@type ) | 描述 |
---|---|
Organization | 组织(通用类型) |
Corporation | 公司 |
NGO | 非政府组织 |
GovernmentOrganization | 政府机构 |
EducationalOrganization | 教育机构(学校、大学) |
LocalBusiness | 本地商家(适用于本地 SEO) |
MedicalOrganization | 医疗机构 |
子类别:地点 & 本地业务
类型 (@type ) | 描述 |
---|---|
Place | 地点(通用类型) |
LocalBusiness | 本地商家,如餐馆、商店 |
LandmarksOrHistoricalBuildings | 地标或历史建筑 |
TouristAttraction | 旅游景点 |
Restaurant | 餐厅 |
Hotel | 酒店 |
子类别:媒体 & 娱乐
类型 (@type ) | 描述 |
---|---|
CreativeWork | 创作作品(通用类型) |
Movie | 电影 |
TVSeries | 电视剧 |
MusicAlbum | 音乐专辑 |
MusicRecording | 音乐录制(单曲) |
VideoGame | 电子游戏 |
PodcastEpisode | 播客节目 |
子类别:产品 & 电商
类型 (@type ) | 描述 |
---|---|
Product | 产品(适用于电商) |
Offer | 产品的报价 |
AggregateOffer | 多个报价的集合 |
Review | 用户评论 |
Brand | 品牌 |
Service | 服务 |
MerchantReturnPolicy | 退货政策 |
子类别:事件
类型 (@type ) | 描述 |
---|---|
Event | 事件(通用类型) |
Festival | 节日、嘉年华 |
SportsEvent | 体育赛事 |
BusinessEvent | 商业活动 |
MusicEvent | 音乐会 |
TheaterEvent | 话剧演出 |
EducationEvent | 教育类活动 |
子类别:结构化数据 & 搜索优化
类型 (@type ) | 描述 |
---|---|
BreadcrumbList | 面包屑导航(SEO 重要) |
FAQPage | FAQ 页面(提升 Google 结果丰富度) |
HowTo | 指南(如“如何做某事”) |
QAPage | 问答页面(适用于论坛) |
Rating | 评分(如产品评分) |
AggregateRating | 综合评分(多个用户的评分) |
其他子类别
类型 (@type ) | 描述 |
---|---|
WebSite | 网站(用于定义整个站点) |
WebPage | 网页(用于特定页面) |
SearchAction | 搜索操作(用于站内搜索) |
EducationalOccupationalProgram | 教育和职业培训项目 |
JobPosting | 招聘信息 |
如何选择正确的 JSON-LD @type
?
- 博客文章 →
BlogPosting
- 新闻文章 →
NewsArticle
- 电商产品 →
Product
- FAQ 页面 →
FAQPage
- 服务型网站 →
Service
- 本地商家 →
LocalBusiness
- 面包屑导航 →
BreadcrumbList
- 活动页面 →
Event
- 产品评论 →
Review
- 网站介绍 →
WebSite
- 网页介绍 →
WebPage
如果你的 JSON-LD 需要支持多种数据,可以用 @graph
组合多个类型。
2. JSON-LD 的嵌套数据结构
JSON-LD 支持嵌套数据结构,可以用于描述复杂的关系。例如,一个 Product
可以嵌套 offers
属性,而 offers
本身又是一个对象。
示例:嵌套结构
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "示例产品",
"description": "这是一个示例产品的描述。",
"offers": {
"@type": "Offer",
"price": "99.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
</script>
3. JSON-LD 数组的使用
JSON-LD 支持数组,可以用于描述多个值或多个对象。例如,一个 FAQPage
可以包含多个问题和答案。
示例:数组
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "示例问题 1",
"acceptedAnswer": {
"@type": "Answer",
"text": "这是示例问题 1 的答案。"
}
},
{
"@type": "Question",
"name": "示例问题 2",
"acceptedAnswer": {
"@type": "Answer",
"text": "这是示例问题 2 的答案。"
}
}
]
}
</script>
4. JSON-LD 多语言支持
通过 @language
关键字,可以为文本指定语言。
示例:多语言支持
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {
"@value": "示例产品",
"@language": "zh"
},
"description": {
"@value": "这是一个示例产品的描述。",
"@language": "zh"
}
}
</script>
关于在 JSON-LD 多语言的更多用法和细节详情请阅读文章:JSON-LD 多语言支持详解:如何同时描述多种语言
JSON-LD 实战示例
为了更好地理解 JSON-LD 的应用,下面将展示几个实战示例,涵盖不同的数据类型、关键字、嵌套结构和多语言支持。这些示例将帮助你深入理解 JSON-LD 在实际中的使用方式。
1. BlogPosting 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/my-awesome-blog-post"
},
"headline": "如何优化你的SEO策略:2025年最佳实践",
"description": "本文将介绍一些 SEO 优化的最佳实践,帮助提升网站排名。",
"datePublished": "2025-03-01T10:00:00+08:00",
"dateModified": "2025-03-01T12:00:00+08:00",
"author": {
"@type": "Person",
"name": "张三"
},
"publisher": {
"@type": "Organization",
"name": "优站SEO",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"image": "https://example.com/blog-post-image.jpg",
"url": "https://example.com/my-awesome-blog-post",
"articleSection": "SEO",
"keywords": "SEO, 网站优化, 搜索引擎"
}
</script>
2. Product 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "高效无线耳机",
"image": "https://example.com/product-image.jpg",
"description": "这款无线耳机提供卓越音质和舒适佩戴感。",
"sku": "12345",
"brand": {
"@type": "Brand",
"name": "音响大师"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/product-page",
"priceCurrency": "CNY",
"price": "299.00",
"priceValidUntil": "2025-12-31",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock"
}
}
</script>
3. Event 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "2025国际编程大会",
"startDate": "2025-05-15T09:00:00+08:00",
"endDate": "2025-05-17T18:00:00+08:00",
"location": {
"@type": "Place",
"name": "上海国际会展中心",
"address": {
"@type": "PostalAddress",
"streetAddress": "上海市浦东新区世纪大道888号",
"addressLocality": "上海",
"addressRegion": "上海市",
"postalCode": "200000",
"addressCountry": "CN"
}
},
"description": "国际编程大会,汇集全球顶级程序员,分享技术趋势与未来展望。",
"url": "https://example.com/event/2025-international-programming-conference",
"image": "https://example.com/event-image.jpg",
"offers": {
"@type": "Offer",
"url": "https://example.com/event-tickets",
"priceCurrency": "CNY",
"price": "999.00",
"availability": "https://schema.org/InStock",
"validFrom": "2025-02-01T09:00:00+08:00"
}
}
</script>
4. Organization 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "创新科技有限公司",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+86-400-123-4567",
"contactType": "Customer Service",
"areaServed": "CN",
"availableLanguage": "Chinese"
},
"sameAs": [
"https://www.facebook.com/innovationtech",
"https://twitter.com/innovation_tech"
]
}
</script>
5. LocalBusiness 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "星光咖啡馆",
"image": "https://example.com/cafe-image.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "北京市朝阳区星光路123号",
"addressLocality": "北京",
"addressRegion": "北京市",
"postalCode": "100000",
"addressCountry": "CN"
},
"openingHours": "Mo-Su 08:00-22:00",
"telephone": "+86-10-12345678",
"url": "https://example.com/star-cafe",
"priceRange": "¥¥"
}
</script>
6. FAQPage 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "什么是SEO?",
"acceptedAnswer": {
"@type": "Answer",
"text": "SEO(搜索引擎优化)是指通过优化网站内容、结构和外部链接等手段,提升在搜索引擎中的排名,从而增加网站的流量。"
}
},
{
"@type": "Question",
"name": "如何提高网站的SEO排名?",
"acceptedAnswer": {
"@type": "Answer",
"text": "提高SEO排名的方法包括优化网站速度、内容质量、关键词使用、外链建设等。"
}
}
]
}
</script>
7. Review 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "李四"
},
"reviewBody": "这款耳机音质不错,佩戴舒适,性价比高。",
"itemReviewed": {
"@type": "Product",
"name": "高效无线耳机"
}
}
</script>
8. WebSite 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "创新科技官网",
"url": "https://example.com",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term}",
"query-input": "required name=search_term"
}
}
</script>
9. WebPage 示例
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "产品页面 - 高效无线耳机",
"url": "https://example.com/product/high-performance-wireless-headphones",
"description": "购买高效无线耳机,享受卓越音质和舒适佩戴。",
"mainEntityOfPage": "https://example.com/product/high-performance-wireless-headphones"
}
</script>
更多 JSON-LD 类型的具体使用示例请参考文章:JSON-LD 类型示例参考手册
JSON-LD 中的 @graph
用法
JSON-LD 中的 @graph
是什么?
@graph
是 JSON-LD 中的一个关键字,允许你在单个 script
标签内包含多个实体(例如多个产品、事件或组织)。它的作用是将多个相关的数据项以结构化的方式组织在一起,从而帮助搜索引擎更好地理解和处理这些数据。
@graph
和我直接写多个 script
block 有什么区别?:
1. 多个 script
block:
- 每个
script
标签通常表示一个独立的结构化数据实体。 - 如果你在页面中使用多个
script
标签,它们之间的内容是独立的,搜索引擎会分别解析每个script
标签。 - 在一些复杂场景下,多个
script
标签可能会导致重复的结构化数据,尤其是当数据项之间存在关联时。
2. 使用 @graph
:
@graph
允许你在同一个 JSON-LD 数据块内,声明多个实体(例如组织、产品、评论等)之间的关联。- 它可以有效减少页面中多个
script
标签的使用,提高页面的结构化数据管理效率。 - 当多个实体之间有联系时,使用
@graph
可以使它们更清晰地组合在一起,而不是分开处理。
举个例子:
如果你有一个页面,既包含一个产品信息,也包含关于该产品的评论,你可以通过 @graph
把这两个实体放在同一个 JSON-LD 数据块里,而不是分别为每个实体写一个单独的 script
标签。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"@graph": [
{
"@type": "Product",
"name": "高效无线耳机",
"price": "299.00",
"currency": "CNY"
},
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "李四"
},
"reviewBody": "这款耳机音质不错,佩戴舒适,性价比高。",
"itemReviewed": {
"@type": "Product",
"name": "高效无线耳机"
}
}
]
}
</script>
JSON-LD 的最佳实践
- 确保内容相关性:JSON-LD 数据应与页面内容高度相关。
- 避免重复数据:如果多个 JSON-LD 数据块包含相同的信息,确保数据一致。
- 遵循搜索引擎指南:确保结构化数据符合 Google 等搜索引擎的指南。
- 测试和验证:使用 Google 的富媒体结果测试工具验证 JSON-LD 是否正确实现。
JSON-LD 常见问题解答
1. 一个页面可以放置多个 JSON-LD 吗?
是的,一个页面可以放置多个 JSON-LD 数据块。可以通过多个 <script>
标签或合并 JSON-LD 数据实现。
2. JSON-LD 必须放在专门的页面吗?
不一定。JSON-LD 可以放在任何包含相关内容的页面上,例如主页、产品页面、博客文章等。
3. 如何验证 JSON-LD 的正确性?
可以使用以下工具验证 JSON-LD:
- Google 富媒体结果测试工具:https://search.google.com/test/rich-results
- JSON-LD Playground:https://json-ld.org/playground/
4. JSON-LD 中如何同时使用多种语言描述
在 JSON-LD 中实现多语言支持时,可以通过多种方式同时描述多种语言的内容。详情可参考文章:如何在 JSON-LD 中使用多语言
5. FAQPage 和 QAPage 这两个类型有何区别
这两者的主要区别在于页面内容的生成方式和互动性,FAQPage 更加静态和正式,而 QAPage 更具互动性和实时性。FAQPage 类型用于表示“常见问题解答”页面。这类页面通常列出一组预定义的、与主题相关的常见问题(FAQ)及其对应的回答。QAPage 类型用于表示问答页面,这种页面通常包括用户生成的内容。与 FAQPage 不同,QAPage 强调的是一个开放式的问答环境,其中问题和答案可能是动态生成的,用户可以提出问题并获取答案。
总结
JSON-LD 是一种强大的结构化数据标记语言,适用于 SEO 优化、语音搜索、数据集成等多种场景。通过合理使用 JSON-LD,可以显著提升网页的搜索可见性和用户体验。希望本文能帮助读者全面掌握 JSON-LD 的使用方法,解决实际应用中的问题。
附录: