如何在JSON-LD中使用多个元素

时间:2018-08-07 15:50:53

标签: schema.org json-ld

我有一个页面描述一个旅游景点(TouristAttraction)。由于我也想添加面包屑信息,因此我也需要添加WebPage

添加两个信息的方式是什么:

  1. 我应该使用WebPage并将TouristAttraction添加为mainEntity吗?
  2. 我应该使用单独的2个JSON-LD script块来创建 WebPageTouristAttraction块?

使用2个实体时:

  1. 我是否必须在两个实体中或仅在一个实体(哪个实体)中提供主要信息(名称,图像,等级等)?

3 个答案:

答案 0 :(得分:2)

使用mainEntity当然比不使用它更好,因为更多的数据(如果准确的话)通常比更少的数据要好。

但是无论您使用一个还是多个mainEntity元素,两种情况下都可以使用script。在第一种情况下,您可以简单地嵌套项目。在第二种情况下,您可以make use of URI references

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "ItemPage",
  "breadcrumb": {
    "@type": "BreadcrumbList"
  },
  "mainEntity": {
    "@type": "TouristAttraction"
  }
}
</script>
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "ItemPage",
  "breadcrumb": {
    "@type": "BreadcrumbList"
  },
  "mainEntity": {"@id": "#content"}
}
</script>

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "TouristAttraction",
  "@id": "#content"
}
</script>

(还有there are other ways。)

当然,无论走哪一条,ItemPageTouristAttraction都是不同的实体。因此,如果您将aggregateRating添加到ItemPage,则用于页面的评分;如果您将其添加到TouristAttraction,则用于景点的评分。对于具有相同值的属性,将它们添加到两个实体仍然有意义,因为消费者可能只对其中一个实体感兴趣,而忽略另一个实体。

答案 1 :(得分:2)

@unor的答案几乎是正确的,但是如果您是针对Google Serp的,则仅将其拆分为单独的json块(或图形表示法)即可得到最佳结果。

假设您要使用Recipe实体来获取google's rich snippet for Recipies的Serps,您将这样做:

<script type="application/ld+json">
{
  "@context":"https:\/\/schema.org",
  "@type":"Recipe",
  "name":"Example",
  "image":"https:\/\/www.example.com"
}
</script>

在Google的Structed Data Testing Tool中,您会看到一个预览按钮:

enter image description here

如果现在要添加其他实体(例如面包屑)的其他信息,则必须使用单独的JSON-LD块,否则将无法获得预览按钮。例如

<script type="application/ld+json">
{
    "@context": "http://schema.org",
    "@type": "ItemPage",
    "breadcrumb": {
        "@type": "BreadcrumbList"
    },
    "mainEntity": {
        "@type":"Recipe",
        "name":"Example",
        "image":"https:\/\/www.example.com"
    }
}
</script>

有效,但不会显示预览按钮。

但是,如果将其拆分,它将显示为单独的实体以及预览按钮:

<script type="application/ld+json">
    {
        "@context": "http://schema.org",
        "@type": "ItemPage",
        "breadcrumb": {
            "@type": "BreadcrumbList"
        }
    }
</script>
<script type="application/ld+json">
{
    "@context": "http://schema.org",
        "@type":"Recipe",
        "name":"Example",
        "image":"https:\/\/www.example.com"
    }
}
</script>

同样适用于数组符号:

<script type="application/ld+json">
[
    {
        "@context": "http://schema.org",
        "@type": "ItemPage",
        "breadcrumb": {
            "@type": "BreadcrumbList"
        }
    },
    {
        "@context": "http://schema.org",
         "@type":"Recipe",
         "name":"Example",
         "image":"https:\/\/www.example.com"
    }
]
</script>

和图形:

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@graph": 
    [
        {
            "@type": "ItemPage",
            "breadcrumb": {
                "@type": "BreadcrumbList"
            }
        },
        {
            "@type":"Recipe",
            "name":"Example",
            "image":"https:\/\/www.example.com"
        }
    ]
}
</script>

贷项转到@unor(另请参见How do you combine several JSON-LD markups?

答案 2 :(得分:0)

WebPage对于网页是隐式的,因此您无需专门添加它。

您可以将BreadcrumbList定义为顶级实体,系统将理解它是WebPage中的实体。

对于要被视为主要实体的实体,还可以将其设置为顶级实体,并使用mainEntityOfPage声明其为主要实体,其id设置为页面的URL。