Google Stops Auto-Correcting Double-Escaped JSON-LD
Googlebot has stopped tidying up badly escaped structured data. Escaping means writing a character in a substitute form so it does not break the code around it: in HTML an ampersand is written &. In a LinkedIn post on 21 August 2026 Google said it is “now only applying a single pass” of HTML unescaping when reading JSON-LD, to bring its parser in line with the JSON standard. Gary Illyes pointed to RFC 8259, which defines JSON string escaping.
Escaping twice is something a template or CMS does by accident, when it escapes a value that was already escaped upstream. & is correct in page text but not inside a <script> block, which is not parsed as HTML. That markup used to come out right, because Googlebot kept decoding until it ran out of layers. Google’s own two examples were an ampersand and a tick mark:
Your markup "Bodger &amp; Badger"
Google, before Bodger & Badger
Google, now Bodger & Badger
Your markup "In stock &#10004;"
Google, before In stock ✔
Google, now In stock ✔
Nothing on your side changed, and nothing fails visibly: a property that used to populate a rich result can simply stop doing so.
One layer of escaping still decodes, though, so a single & is not what broke. These still reach Google as intended:
"Bodger & Badger" → Bodger & Badger
"In stock ✔" → In stock ✔
Neither is standard JSON. Both work only because Google decodes them for you, and that leniency is what is being reduced, so they are worth moving off.
Run a few templated pages through the Rich Results Test and check the extracted values read the way they should. Where they do not, the fix is upstream: find the step in your template that escapes an already-escaped value and remove it. Google’s instruction is to “update your code to standard JSON escapes or Unicode hexadecimal escapes (like \u0026)”, which means:
"Bodger & Badger" plain character, no escape needed
"Bodger \u0026 Badger" Unicode escape, same value
"In stock ✔" plain character, no escape needed
"In stock \u2714" Unicode escape, same value
The two numbers differ because HTML’s ✔ is decimal and a JSON escape hexadecimal; both are U+2714. Sites already emitting standards-compliant JSON-LD have nothing to do here.
Sources
More news
-
Google Releases an Embeddable Preferred Sources Button for Publishers
Google's new one-click Preferred Sources button keeps readers on the page. Measured: the two-line install pulls 470 KB across 23 requests to render it.
-
Google Stops Its Test of AI-Generated Images Inside AI Overviews
Google ran and then stopped a test placing AI-generated illustrations inside AI Overviews for recipe queries. It is not the Nano Banana feature.
-
Google Confirms Search Console AI Impressions Drop Is a Logging Issue
Google has closed the Search Console Generative AI impressions error at 13 to 17 August. It is a logging fault, not lost visibility, and the days may not return.