malformed JSON string, neither array, object, number, string or atom, at character offset N (before "…")
This message comes from JSON::PP on Perl 5.038002. In this registry it is produced by 16 distinct mistakes. Positions in the real message vary with your input; the causes do not.
What produces this message
Bare unquoted word as a JSON document
helloExact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "hello")
Fix: Quote it: `"hello"` is a valid JSON document, `hello` is not.
UTF-8 BOM before a JSON document
{"a": 1}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "\x{ef}\x{bb}\x{bf}{"...")
Fix: Save the file as UTF-8 without BOM. In PowerShell use `Set-Content -Encoding utf8NoBOM`; in Notepad choose 'UTF-8' rather than 'UTF-8 with BOM'.
Double comma in a JSON array
[1,,2]Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 3 (before ",2]")
Fix: Remove the extra comma, or write `null` if the empty slot is meaningful.
Empty string passed to a JSON parser
Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)")
Fix: Check for an empty body before parsing, and log the status code and content-length alongside it.
HTML received where JSON was expected
<!DOCTYPE html>
<html><body>500</body></html>Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE html>\x{a}...")
Fix: 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.
Infinity is not valid JSON
{"a": Infinity}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "Infinity}")
Fix: Write `null`, a string, or clamp the value before serialising. Python: `json.dumps(x, allow_nan=False)`.
Leading decimal point in a JSON number
{"a": .5}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before ".5}")
Fix: Write `0.5`.
Leading plus sign in a JSON number
{"a": +1}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "+1}")
Fix: Drop the plus, or quote the value if the sign is meaningful text.
NaN is not valid JSON
{"a": NaN}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "NaN}")
Fix: Emit `null` instead, or a sentinel your consumer understands. In Python, pass `allow_nan=False` to `json.dumps` so the problem surfaces at write time rather than at read time in someone else's service.
Python True / False / None in JSON
{"a": True, "b": None}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "True, "b": None}")
Fix: Serialise with `json.dumps()` rather than `str()`, `repr()`, or an f-string.
Whole JSON document wrapped in quotes
'{"a": 1}'Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "'{"a": 1}'")
Fix: Parse twice, or fix the producer so it sends the object rather than a string containing the object.
Trailing comma in a JSON array
[1, 2, 3,]Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 9 (before "]")
Fix: Delete the comma before the closing bracket, or build the array with a join instead of manual concatenation.
undefined is not valid JSON
{"a": undefined}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "undefined}")
Fix: Use `null` for an intentionally empty value, or omit the key entirely.
The literal string 'undefined' as a JSON document
undefinedExact message: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "undefined")
Fix: Guard against undefined before sending, and send `JSON.stringify(value)` rather than a template literal.
Unquoted string value in JSON
{"a": hello}Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "hello}")
Fix: Wrap the value in double quotes.
Whitespace-only input
Exact message: malformed JSON string, neither array, object, number, string or atom, at character offset 6 (before "(end of string)")
Fix: Treat whitespace-only as empty and handle it before parsing.
What other parsers say about the same input
If a colleague reports a different message for what looks like the same file, this is why.
| Parser | Message for the same inputs |
|---|---|
| CPython json.loads | Expecting value: line L column C (char N)Unexpected UTF-8 BOM (decode using utf-8-sig): line L column C (char N) |
| Gson | Use JsonReader.setLenient(true) to accept malformed JSON at line L column C path $… |
| Gson JsonParser (lenient off) | Use JsonReader.setLenient(true) to accept malformed JSON at line L column C path $… |
| JSON5 | JSON5: invalid character ',' at 1:4JSON5: invalid character '<' at 1:1JSON5: invalid character 'T' at 1:7JSON5: invalid character 'h' at 1:1JSON5: invalid character 'h' at 1:7JSON5: invalid character 'u' at 1:1JSON5: invalid character 'u' at 1:7JSON5: invalid end of input at 1:1JSON5: invalid end of input at 2:3 |
| Jackson ObjectMapper | Non-standard token 'Infinity': enable `JsonReadFeature.ALLOW_NON_NUMERIC_NUMBERS` to allowNon-standard token 'NaN': enable `JsonReadFeature.ALLOW_NON_NUMERIC_NUMBERS` to allowUnexpected character (''' (code 39)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unexpected character ('+' (code 43)) in numeric value: JSON spec does not allow numbers to have plus signs: enable `JsonReadFeature.ALLOW_LEADING_PLUS_SIGN_FOR_NUMBERS` to allowUnexpected character (',' (code 44)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unexpected character ('.' (code 46)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unexpected character ('?' (code 65279 / 0xfeff)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unexpected character (']' (code 93)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unrecognized token 'True': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unrecognized token 'hello': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')Unrecognized token 'undefined': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') |
| JavaScriptCore JSON.parse | JSON Parse error: Single quotes (') are not allowed in JSONJSON Parse error: Unexpected EOFJSON Parse error: Unexpected comma at the end of array expressionJSON Parse error: Unexpected identifier "Infinity"JSON Parse error: Unexpected identifier "NaN"JSON Parse error: Unexpected identifier "True"JSON Parse error: Unexpected identifier "hello"JSON Parse error: Unexpected identifier "undefined"JSON Parse error: Unexpected token ','JSON Parse error: Unexpected token '.'JSON Parse error: Unrecognized token '+'JSON Parse error: Unrecognized token '<'JSON Parse error: Unrecognized token '' |
| Newtonsoft.Json JsonConvert | Unexpected character encountered while parsing value: +. Path 'a', line L, position N.Unexpected character encountered while parsing value: <. Path '', line L, position N.Unexpected character encountered while parsing value: T. Path 'a', line L, position N.Unexpected character encountered while parsing value: h. Path '', line L, position N.Unexpected character encountered while parsing value: h. Path 'a', line L, position N.Unexpected character encountered while parsing value: . Path '', line L, position N. |
| Newtonsoft.Json JsonTextReader | Unexpected character encountered while parsing value: +. Path 'a', line L, position N.Unexpected character encountered while parsing value: <. Path '', line L, position N.Unexpected character encountered while parsing value: T. Path 'a', line L, position N.Unexpected character encountered while parsing value: h. Path '', line L, position N.Unexpected character encountered while parsing value: h. Path 'a', line L, position N.Unexpected character encountered while parsing value: . Path '', line L, position N. |
| Ruby JSON.parse | unexpected token at '…' |
| SpiderMonkey JSON.parse | JSON.parse: unexpected character at line L column C of the JSON dataJSON.parse: unexpected end of data at line L column C of the JSON data |
| System.Text.Json Deserialize | ''' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'+' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.',' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'.' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'0xEF' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'<' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'I' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'N' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'T' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'h' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.'u' is an invalid start of a value. Path: $ | LineNumber: L | BytePositionInLine: C.The JSON array contains a trailing comma at the end which is not supported in this mode. Change the reader options. Path: $ | LineNumber: L | BytePositionInLine: C.The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: L | BytePositionInLine: C. |
| System.Text.Json JsonDocument | ''' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'+' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.',' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'.' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'0xEF' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'<' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'I' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'N' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'T' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'h' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.'u' is an invalid start of a value. LineNumber: L | BytePositionInLine: C.The JSON array contains a trailing comma at the end which is not supported in this mode. Change the reader options. LineNumber: L | BytePositionInLine: C.The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: L | BytePositionInLine: C. |
| V8 JSON.parse | "undefined" is not valid JSONUnexpected end of JSON inputUnexpected token ''', "'{"a": 1}'" is not valid JSONUnexpected token '+', "{"a": +1}" is not valid JSONUnexpected token ',', "[1,,2]" is not valid JSONUnexpected token '.', "{"a": .5}" is not valid JSONUnexpected token '<', "…"... is not valid JSONUnexpected token 'I', "{"a": Infinity}" is not valid JSONUnexpected token 'N', "{"a": NaN}" is not valid JSONUnexpected token 'T', "{"a": True, "b"…"... is not valid JSONUnexpected token ']', "[1, 2, 3,]" is not valid JSONUnexpected token 'h', "hello" is not valid JSONUnexpected token 'h', "{"a": hello}" is not valid JSONUnexpected token 'u', "{"a": undefined}" is not valid JSONUnexpected token '', "{"a": 1}" is not valid JSON |
| encoding/json Unmarshal | invalid character '+' looking for beginning of valueinvalid character ',' looking for beginning of valueinvalid character '.' looking for beginning of valueinvalid character '<' looking for beginning of valueinvalid character 'I' looking for beginning of valueinvalid character 'N' looking for beginning of valueinvalid character 'T' looking for beginning of valueinvalid character '\'' looking for beginning of valueinvalid character ']' looking for beginning of valueinvalid character 'h' looking for beginning of valueinvalid character 'u' looking for beginning of valueinvalid character 'ï' looking for beginning of valueunexpected end of JSON input |
| hjson | End of input while parsing an object (missing '}') at line L,10End of input while parsing an object (missing '}') at line L,12End of input while parsing an object (missing '}') at line L,15End of input while parsing an object (missing '}') at line L,16End of input while parsing an object (missing '}') at line L,22End of input while parsing an object (missing '}') at line L,9Found EOF while looking for a key name (check your syntax) at line L,30Found a punctuator character ',' when expecting a quoteless string (check your syntax) at line L,3 |
| json-bigint | Unexpected ''Unexpected '''Unexpected '+'Unexpected ','Unexpected '.'Unexpected '<'Unexpected 'I'Unexpected 'N'Unexpected 'T'Unexpected ']'Unexpected 'h'Unexpected 'u'Unexpected '' |
| json_decode | Syntax error |
| orjson | Input is a zero-length, empty document: line L column C (char N)UTF-8 byte order mark (BOM) is not supported: line L column C (char N)input data is empty: line L column C (char N)no digit after sign: line L column C (char N)trailing comma is not allowed: line L column C (char N)unexpected character, expected a JSON value: line L column C (char N) |
| serde_json::from_str | EOF while parsing a value at line L column Cexpected value at line L column Ctrailing comma at line L column C |
| ujson | Expected object or valueUnexpected character found when decoding array value (1) |
Standards this registry is checked against
- RFC 8259 (STD 90) — The JavaScript Object Notation (JSON) Data Interchange Format, T. Bray, Ed., 2017. The IETF Internet Standard for JSON. Obsoletes RFC 7159 and RFC 4627.
- ECMA-404, 2nd edition — The JSON Data Interchange Syntax, Ecma International, 2017. Ecma’s grammar for JSON. A normative reference of RFC 8259; the two define the same syntax.
- The Unicode Standard — The Unicode Standard, Core Specification, The Unicode Consortium, current. Normatively referenced by RFC 8259 for the definition of a character.
- IEEE 754-2019 — IEEE Standard for Floating-Point Arithmetic, IEEE, 2019. Referenced by RFC 8259 §6 as the basis for its interoperability guidance on numbers.
Only standards bodies and peer-reviewed venues are cited. Error strings on this site are observed by executing each parser; the standards above define what the parser is reacting to.