TLDR; You can merge structured data formats such as Microdata and JSON-LD on the same page and Google will accept it. However, each type needs to be in a separate format, you can’t merge JSON-LD and Microdata for the same type e.g. Product, where the price is in Microdata, but the rest is in JSON-LD.
Sometimes you take over a website which already has structured data on it. If there’s hundreds of pages, the prospect of rewriting all that into a different format like JSON-LD can be very daunting.
Luckily, Google announced in October 2023 that it will start supporting different schema formats on the same page.
What if there is more than one structured data format on the page?
Some websites will have two different formats of structured data on the same page. Whilst this isn’t recommended, Google has confirmed that it started supporting this via Syntax Graph Merge, so you might see both JSON-LD and also Microdata on the same site.
Jono Alderson posted this example:

In order for this to work, you need to merge the structured data formats together using @id in the JSON-LD:
"@id": "https://example.com/articles/some-article#mainEntityOfPage"
and also in the Microdata:
itemid="https://example.com/articles/some-article#mainEntityOfPage"
This can cause conflicts if both formats have the same properties, or have conflicting properties for the same type, for example:
In the microdata it says that the name of the event is “My fabulous event”:
<article itemid="https://example.com/articles/some-article#mainEntityOfPage" itemscope itemtype="https://schema.org/Event"><span itemprop="name">My fabulous event</span>
In the JSON-LD it says that the name of the event is “My great event”:
"mainEntityOfPage": {
"@id": "https://example.com/articles/some-article",
"@type": "Event",
"name": "My great event",
"description": "The <meta> description goes here.",
"url": "https://example.com/articles/some-article"
}
Search engines will be confused as to what the name of the event actually is, as you are giving them conflicting information. The idea of the merge is that they are supposed to compliment each other, and not conflict.
So in this case, I would recommend removing the “name” property from the JSON-LD. The name property should be in either one or the other (not both) which are then linked together using the @id.
Check the properties in both sets of code and identify any that could conflict with each other. You only need one overall out of both sets, which are then merged together with the @id. You can check this using Google’s Rich Results Testing tool to make sure that it validates using either your code, or the URL of the page.
Further Reading
These articles are worth reading if you are interested in more about the Syntax Graph Merge:
https://www.searchenginejournal.com/google-now-allows-mixing-structured-data-formats/499321/
https://www.seroundtable.com/google-search-supports-syntax-graph-merge-36265.html
https://searchengineland.com/google-syntax-graph-merge-for-structured-data-433734

Written by Kelly Sheppard
Kelly Sheppard is a search engine optimisation professional, author of the book “The Structured Data Guide for Beginners” and the founder of The Structured Data Company.