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ě.
Příčiny a opravy
JSON.parse na objektu, který už JSON není
{"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.
// 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:
function parseIfText(value) {
return typeof value === 'string' ? JSON.parse(value) : value;
} JSON.parse na undefined (chybějící hodnota)
{"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.
// 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.
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.