Formatter Validator Minifier Escape / Unescape JSON ↔ String JSON ↔ YAML JSON → CSV NDJSON / JSON Lines JSON → Types JSON ↔ XML JSON Diff JSON Patch Canonicalize (RFC 8785) Schema Validator Schema Generator JSONPath Tester JWT Decoder JSON Errors Schemas More Tools
JSONTools / JSON errors / HTML received where JSON was expected
JSON error registry · Wrong input entirely

HTML received where JSON was expected

The response body is an HTML page, not JSON. The server returned an error page, a login redirect, a proxy or captive-portal interstitial, or a rate-limit page — and the client parsed it without checking the status code or content type.

The input

Fails to parse
<!DOCTYPE html>
<html><body>500</body></html>
Parses correctly
{"error": "internal"}

Open this broken input in the formatter →

How to fix it

Check the HTTP status and the Content-Type header before parsing. Log the first 200 characters of the body when parsing fails so the actual page is visible in your logs.

An error mentioning `<` at position 0 essentially always means this. The JSON is not malformed — you did not receive JSON at all.

What each parser reports

Every message below was captured by running this exact input through the parser named. 21 of 21 parsers rejected it.

Parser Exact message
CPython json.loads
CPython 3.12.3
Expecting value: line 1 column 1 (char 0)
what this message means →
encoding/json Unmarshal
Go go1.22.2
invalid character '<' looking for beginning of value
what this message means →
Gson
Java 21.0.12
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
what this message means →
Gson JsonParser (lenient off)
Java 21.0.12
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
what this message means →
hjson
Node.js 22.22.2
Found EOF while looking for a key name (check your syntax) at line 2,30 >>><html><body>500</bod ...
what this message means →
Jackson ObjectMapper
Java 21.0.12
Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
what this message means →
JavaScriptCore JSON.parse
JavaScriptCore (Bun 1.4.1)
JSON Parse error: Unrecognized token '<'
what this message means →
json-bigint
Node.js 22.22.2
Unexpected '<'
JSON5
Node.js 22.22.2
JSON5: invalid character '<' at 1:1
what this message means →
JSON::PP
Perl 5.038002
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE html>\x{a}...")
what this message means →
json_decode
PHP 8.3.6
Syntax error
Newtonsoft.Json JsonConvert
Newtonsoft.Json 13.0.3 on .NET 8.0.30
Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
what this message means →
Newtonsoft.Json JsonTextReader
Newtonsoft.Json 13.0.3 on .NET 8.0.30
Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
what this message means →
orjson
CPython 3.12.3
unexpected character, expected a JSON value: line 1 column 1 (char 0)
what this message means →
Ruby JSON.parse
Ruby 3.2.3
unexpected token at '<!DOCTYPE html> <html><body>500</body></html>'
serde_json::from_str
Rust (serde_json 1.x)
expected value at line 1 column 1
what this message means →
SpiderMonkey JSON.parse
SpiderMonkey 115
JSON.parse: unexpected character at line 1 column 1 of the JSON data
what this message means →
System.Text.Json Deserialize
.NET 8.0.30
'<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
what this message means →
System.Text.Json JsonDocument
.NET 8.0.30
'<' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.
what this message means →
ujson
CPython 3.12.3
Expected object or value
V8 JSON.parse
Node.js 22.22.2
Unexpected token '<', "<!DOCTYPE "... is not valid JSON
what this message means →

What the specification says

The exact sections that govern this error. Descriptions are our paraphrase; follow the links for the normative text.

Body Section
IETF
A JSON text is a single value with optional surrounding whitespace (JSON-text = ws value ws). The token set is six structural characters, strings, numbers and three literal names — nothing else.
IETF
Registers the application/json media type — the Content-Type a JSON response is supposed to carry.
IETF
Defines Content-Type, the header that tells you a response is not JSON before you parse it.

Other errors in this category

Empty string passed to a JSON parser

The document is zero bytes. Almost always an upstream failure: an HTTP call that returned 204, a file that was never written, a va…

Whitespace-only input

The document contains only spaces, tabs or newlines. Same family as empty input — a file was created but never filled.…

Extra data after a JSON document

Two complete documents concatenated. Usually a file appended to rather than overwritten, or several API responses written to the s…

Trailing characters after a JSON document

Non-whitespace content after the closing brace — a stray word, a shell prompt captured with the output, or a log line appended to …

The literal string 'undefined' as a JSON document

A JavaScript variable holding `undefined` was interpolated into a string and sent as the body. `String(undefined)` is `"undefined"…

Bare unquoted word as a JSON document

A single token with no quotes. Either a plain-text response being parsed as JSON, or a string value that was never quoted.…

Whole JSON document wrapped in quotes

The document is double-encoded — a JSON string containing JSON, or a shell variable that kept its surrounding quotes.…

NDJSON fed to a whole-document JSON parser

Newline-delimited JSON: one complete document per line. Each line is valid on its own, but the file as a whole is not a single JSO…

← All JSON parser errors