Aufwärmen · Aufgabe 1 von 7
Zum Aufwärmen aus Lektion B5.3: Was gibt dieser Code aus?
const item = { name: "tea", price: 3 };
const copy = { ...item };
copy.price = 4;
console.log(item.price, copy.price);// B5.4 · ca. 30 Min. · Einstieg
Nach dieser Lektion wandeln Sie Daten in JSON-Text um und zurück, schreiben JSON, das sich parsen lässt, und prüfen Geladenes.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
const item = { name: "tea", price: 3 };
const copy = { ...item };
copy.price = 4;
console.log(item.price, copy.price);Vorhersagen · Aufgabe 2 von 7
const text = '{"name": "Ada", "age": 36}';
console.log(text.name, JSON.parse(text).name);Üben · Aufgabe 3 von 7
const text = '{"count": 2}';
const data = JSON.____(text);
console.log(data.count + 1);Üben · Aufgabe 4 von 7
Üben · Aufgabe 5 von 7
console.log(JSON.stringify({ a: 1, b: undefined, c: [1, undefined] }));Denksport · Aufgabe 6 von 7
const order = { total: NaN, when: new Date(0) };
const copy = JSON.parse(JSON.stringify(order));
console.log(copy.total, typeof copy.when);Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Eine Leseliste wird in JSON-Text umgewandelt und zurück. Der Text ist ein einziger String ohne Leerzeichen; mit Einrückung verteilt er sich auf mehrere Zeilen. Parsen liefert wieder echte Objekte, Hin und Rückweg eine unabhängige Kopie, und ein Objekt mit NaN, undefined, einem Date und einer Methode zeigt, was JSON nicht speichern kann. Der letzte Teil, eine Vorschau auf Modul I4, fängt den SyntaxError von JSON mit einfachen Anführungszeichen ab.
main.js
// A reading list saved as JSON text and loaded back.
const list = [
{ title: "Dune", pages: 412, read: true },
{ title: "Emma", pages: 474, read: false }
];
const text = JSON.stringify(list);
console.log(text);
console.log(typeof text, Array.isArray(list));
console.log(JSON.stringify(list[0], null, 2));
const loaded = JSON.parse(text);
console.log(loaded[1].title, Array.isArray(loaded), typeof loaded[0]);
const copy = JSON.parse(JSON.stringify(list));
copy[0].read = false;
console.log(list[0].read, copy[0].read);
const odd = { score: NaN, note: undefined, when: new Date(0), show() {} };
console.log(JSON.stringify(odd));
try {
JSON.parse("{'title': 'Dune'}");
} catch (error) {
console.log(error.name + ": " + error.message);
}
Ausführen mit
node main.jsAusgabe
[{"title":"Dune","pages":412,"read":true},{"title":"Emma","pages":474,"read":false}]
string true
{
"title": "Dune",
"pages": 412,
"read": true
}
Emma true object
true false
{"score":null,"when":"1970-01-01T00:00:00.000Z"}
SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Übung 1 von 2
parseScores(text) soll JSON-Text parsen und das enthaltene Array zurückgeben. Enthält der Text etwas anderes, etwa ein Objekt oder eine Zahl, soll die Funktion ein leeres Array zurückgeben, []. isRecord(value) soll nur für ein einfaches Objekt true liefern: nicht für null, nicht für ein Array, nicht für eine Zahl. Der Starter vertraut dem Text, und sein isRecord sagt ja zu null und zu Arrays. Korrigieren Sie beides mit Array.isArray, typeof und einer Prüfung auf null.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Führen Sie die Tests aus: parseScores gibt das geparste Objekt zurück, und isRecord(null) ist true, weil typeof null "object" ist.
Speichern Sie den geparsten Wert in einer Konstanten und geben Sie dann Array.isArray(data) ? data : [] zurück.
Ergänzen Sie isRecord um zwei Prüfungen mit &&: value !== null und !Array.isArray(value).
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// The array in the JSON text, or [] when the text holds something else.
export function parseScores(text) {
const data = JSON.parse(text);
return Array.isArray(data) ? data : [];
}
// true only for a plain object: not null, not an array.
export function isRecord(value) {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
// The array in the JSON text, or [] when the text holds something else.
export function parseScores(text) {
return JSON.parse(text);
}
// true only for a plain object: not null, not an array.
export function isRecord(value) {
return typeof value === "object";
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {parseScores, isRecord} from './main.js';
test('parseScores gibt das Array aus dem Text zurück', () => {
const got = parseScores('[3, 5, 8]');
assert.deepEqual(got, [3, 5, 8], `parseScores('[3, 5, 8]') gab ${JSON.stringify(got)} zurück, erwartet war [3,5,8]`);
});
test('parseScores gibt [] für ein Objekt zurück', () => {
const got = parseScores('{"scores": [3, 5]}');
assert.deepEqual(got, [], `parseScores für ein Objekt gab ${JSON.stringify(got)} zurück, erwartet war []`);
});
test('parseScores gibt [] für eine Zahl zurück', () => {
const got = parseScores('7');
assert.deepEqual(got, [], `parseScores('7') gab ${JSON.stringify(got)} zurück, erwartet war []`);
});
test('isRecord ist true für ein Objekt', () => {
assert.equal(isRecord(JSON.parse('{"a": 1}')), true, 'isRecord für ein Objekt sollte true sein');
});
test('isRecord ist false für null und für ein Array', () => {
assert.equal(isRecord(JSON.parse('null')), false, 'isRecord(null) sollte false sein');
assert.equal(isRecord(JSON.parse('[1]')), false, 'isRecord für ein Array sollte false sein');
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenÜbung 2 von 2
toJson(data) soll den JSON-Text von data zurückgeben, um zwei Leerzeichen eingerückt, bereit zum Speichern in einer Datei. copyData(data) soll eine Kopie zurückgeben, die sich ändern lässt, verschachtelte Arrays eingeschlossen, ohne data zu ändern. Die Daten sind einfach: Objekte, Arrays, Strings, Zahlen und Booleans. Der Starter schreibt alles in eine Zeile, und seine Spread-Kopie teilt sich die verschachtelten Arrays. Korrigieren Sie beides mit JSON.stringify und JSON.parse.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Führen Sie die Tests aus: toJson liefert eine lange Zeile, und ein push auf die items der Kopie ändert auch das Original.
JSON.stringify nimmt die Einrückung als drittes Argument; das zweite ist null.
Wandeln Sie data in Text um und parsen Sie ihn zurück: JSON.parse(JSON.stringify(data)) baut jedes verschachtelte Array neu.
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// The JSON text of data, indented by two spaces.
export function toJson(data) {
return JSON.stringify(data, null, 2);
}
// A copy whose nested arrays and objects are its own.
export function copyData(data) {
return JSON.parse(JSON.stringify(data));
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
// The JSON text of data, indented by two spaces.
export function toJson(data) {
return JSON.stringify(data);
}
// A copy whose nested arrays and objects are its own.
export function copyData(data) {
return { ...data };
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {toJson, copyData} from './main.js';
test('toJson rückt um zwei Leerzeichen ein', () => {
const got = toJson({ name: 'Ada', tags: ['x'] });
const expected = '{\n "name": "Ada",\n "tags": [\n "x"\n ]\n}';
assert.equal(got, expected, `toJson gab ${JSON.stringify(got)} zurück, erwartet war ${JSON.stringify(expected)}`);
});
test('copyData kopiert jeden Schlüssel', () => {
const got = copyData({ owner: 'Ada', items: ['tea'] });
assert.deepEqual(got, { owner: 'Ada', items: ['tea'] }, `copyData gab ${JSON.stringify(got)} zurück`);
});
test('Das verschachtelte Array der Kopie zu ändern lässt das Original unverändert', () => {
const data = { owner: 'Ada', items: ['tea'] };
const copy = copyData(data);
copy.items.push('milk');
assert.deepEqual(data.items, ['tea'], `die items des Originals wurden zu ${JSON.stringify(data.items)}, erwartet war ["tea"]`);
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenconst text = '{"name": "Ada", "age": 36,}';
const user = JSON.parse(text);
console.log(user.name);
Was Node.js ausgibt
SyntaxError: Expected double-quoted property name in JSON at position 26 (line 1 column 27)Warum, und die Lösung
JavaScript erlaubt ein Komma nach dem letzten Eintrag, JSON nicht. Nach dem Komma erwartet JSON.parse einen weiteren Schlüssel in doppelten Anführungszeichen und findet }, an Position 26 (gezählt ab 0). Entfernen Sie das Komma: '{"name": "Ada", "age": 36}'. JSON aus JSON.stringify hat dieses Problem nie; es entsteht bei JSON, das von Hand geschrieben wurde.
const text = "{'name': 'Ada'}";
const user = JSON.parse(text);
console.log(user.name);
Was Node.js ausgibt
SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)Warum, und die Lösung
JSON-Schlüssel und -Strings nehmen nur doppelte Anführungszeichen, deshalb ist das einfache Anführungszeichen an Position 1 kein Eigenschaftsname. Schreiben Sie das JSON mit doppelten Anführungszeichen und setzen Sie den JavaScript-String in einfache Anführungszeichen oder Backticks: '{"name": "Ada"}'. Firefox und Safari formulieren diese Meldung anders; die Position ist der Hinweis.
const user = { name: "Ada" };
const data = JSON.parse(user);
console.log(data.name);
Was Node.js ausgibt
SyntaxError: "[object Object]" is not valid JSONWarum, und die Lösung
JSON.parse nimmt Text. Bekommt es ein Objekt, wandelt es dieses zuerst in einen String um, "[object Object]", und das ist kein JSON. user ist schon ein Objekt: Verwenden Sie es direkt, user.name. Parsen Sie nur Strings, die JSON enthalten, etwa Text aus einer Datei, von einem Server oder aus JSON.stringify.
JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.