diff --git a/script/hassfest/__main__.py b/script/hassfest/__main__.py
index aec1fd34b1550d84c94ce0cb6a974c8319c4400b..6fbefc11a2f0504d39bc1337ff63b50cac26976a 100644
--- a/script/hassfest/__main__.py
+++ b/script/hassfest/__main__.py
@@ -9,6 +9,7 @@ from . import (
     config_flow,
     coverage,
     dependencies,
+    json,
     manifest,
     services,
     ssdp,
@@ -18,6 +19,7 @@ from . import (
 from .model import Config, Integration
 
 INTEGRATION_PLUGINS = [
+    json,
     codeowners,
     config_flow,
     dependencies,
diff --git a/script/hassfest/json.py b/script/hassfest/json.py
new file mode 100644
index 0000000000000000000000000000000000000000..39c1f6f13a926e51a036332846c1d7207d128856
--- /dev/null
+++ b/script/hassfest/json.py
@@ -0,0 +1,32 @@
+"""Validate integration JSON files."""
+import json
+from typing import Dict
+
+from .model import Integration
+
+
+def validate_json_files(integration: Integration):
+    """Validate JSON files for integration."""
+    for json_file in integration.path.glob("**/*.json"):
+        if not json_file.is_file():
+            continue
+
+        try:
+            json.loads(json_file.read_text())
+        except json.JSONDecodeError:
+            relative_path = json_file.relative_to(integration.path)
+            integration.add_error("json", f"Invalid JSON file {relative_path}")
+
+    return
+
+
+def validate(integrations: Dict[str, Integration], config):
+    """Handle JSON files inside integrations."""
+    if not config.specific_integrations:
+        return
+
+    for integration in integrations.values():
+        if not integration.manifest:
+            continue
+
+        validate_json_files(integration)