"[object Object]" is not valid JSON: JSON.parse na objektu

JSON.parse čte text. Když dostane objekt, převede ho nejdřív na řetězec "[object Object]" a ten JSON není; undefined se stejně převede na "undefined". Hláška "[object Object]" is not valid JSON tedy skoro vždy znamená, že data už JSON nejsou: byla přečtená dřív, nebo hodnota chybí.

Autor: Aktualizováno

Znění hlášky v jednotlivých prostředích

Hláška je typická pro JavaScript. Ostatní řádky ukazují, co jiné parsery řeknou, když dostanou stejný text; v Pythonu nebo PHP takový text vznikne jen výjimečně.

Parser Hláška Kdy
Node.js 25, Chrome 153 (V8) JSON.parse, response.json(), Edge a další prohlížeče s V8 "[object Object]" is not valid JSON JSON.parse na objektu, který už JSON není
"undefined" is not valid JSON JSON.parse na undefined (chybějící hodnota)
Python 3.14 json.loads, json.load (json.JSONDecodeError) Expecting value: line 1 column 2 (char 1) JSON.parse na objektu, který už JSON není
Expecting value: line 1 column 1 (char 0) JSON.parse na undefined (chybějící hodnota)
Python 3.9 starší verze, např. systémový Python v macOS Expecting value: line 1 column 2 (char 1) JSON.parse na objektu, který už JSON není
Expecting value: line 1 column 1 (char 0) JSON.parse na undefined (chybějící hodnota)
.NET 10 (System.Text.Json) JsonDocument.Parse, JsonSerializer.Deserialize 'o' is an invalid start of a value. JSON.parse na objektu, který už JSON není
'u' is an invalid start of a value. JSON.parse na undefined (chybějící hodnota)
PHP 8.4 json_last_error_msg(), JsonException s JSON_THROW_ON_ERROR Syntax error JSON.parse na objektu, který už JSON není, JSON.parse na undefined (chybějící hodnota)

Příčiny a opravy

JSON.parse na objektu, který už JSON není

Chybně
[object Object]
Opraveno
{"jmeno":"Eva"}

Nejčastější je dvojí čtení: response.json() ve fetch API vrací už objekt a axios s výchozím responseType: 'json' vrací v response.data také už objekt. Další JSON.parse je navíc.

Dvojí čtení odpovědi
// Chybně: response.json() už JSON přečetl a vrátil objekt
const data = await response.json();
const kniha = JSON.parse(data); // "[object Object]" is not valid JSON

// Správně
const kniha = await response.json();

Když funkce dostává někdy text a někdy už objekt, rozhodni podle typu:

Parsovat jen text
function parseIfText(value) {
  return typeof value === 'string' ? JSON.parse(value) : value;
}

JSON.parse na undefined (chybějící hodnota)

Chybně
undefined
Opraveno
{"jmeno":"Eva"}

undefined přijde, když čteš vlastnost, která neexistuje, nebo funkci, která nic nevrátila. Zkontroluj zdroj hodnoty, ne JSON. Pozor na rozdíl: JSON.parse(null) chybu nevyhodí, protože text "null" je platný JSON a výsledkem je null.

localStorage: čtení a zápis
// getItem vrátí null, když klíč neexistuje; JSON.parse(null) vrátí null bez chyby
const nastaveni = JSON.parse(localStorage.getItem('nastaveni')) ?? {};

// Ukládá se text, ne objekt
localStorage.setItem('nastaveni', JSON.stringify(nastaveni));

Obdoba v Pythonu

Python řetězec z objektu nevyrábí a rovnou ohlásí špatný typ. Jde o stejnou chybu: data už byla převedená, například z response.json() knihovny requests.

json.loads na slovníku
import json

json.loads({'a': 1})
# TypeError: the JSON object must be str, bytes or bytearray, not dict

Rozdíl mezi JSON textem, literálem objektu v JavaScriptu a výsledkem JSON.parse vysvětluje kapitola JSON vs JavaScript objekt.