Found the solution after much fiddling. In my case, in my custom themes file;
I was declaring the tab block so I could add extra tabs to the product page;
<block class="Magento\Catalog\Block\Product\View\Description" name="product.info.details" template="product/view/details.phtml" after="product.info.media">
..... new tabs in here
With this in place, I noticed the reviews tab would no longer load despite being set to do so in the core layout files (/app/code/Magento/Review/view/frontend/layout...), so I was manually adding it within my product.info.details block;
<block class="Magento\Review\Block\Product\Review" name="reviews.tab" template="Magento_Review::review.phtml" group="detailed_info">
<block class="Magento\Review\Block\Form" name="product.review.form" as="review_form">
<container name="product.review.form.fields.before" as="form_fields_before" label="Review Form Fields Before"/>
However, this is the wrong way to go. Instead of redeclaring the whole product.info.details block in your custom theme product view layout, just reference the existing block instead. So change your call to;
.... custom tabs in here - dont manually add the reviews tab
Add whatever custom tabs you need here, and remove the direct call to the reviews tab if it is present.
Problem solved. The reviews tab and form are now present and the json error goes away - which means messages can appear on the product page again ('You submitted your review for moderation.' etc).
Hope this helps