Zum Hauptinhalt springen

JSON

  • JavaScript Object Notation
  • Textformat zur Datenspeicherung und zum Datentransport

XML vs. JSON

  • JSON ist viel kürzer und lesbarer
  • JSON wird deshalb vorzugsweise genutzt

<employees>
<employee>
<firstName>John</firstName>
<lastName>Doe</lastName>
</employee>
<employee>
<firstName>Anna</firstName>
<lastName>Smith</lastName>
</employee>
<employee>
<firstName>Peter</firstName>
<lastName>Jones</lastName>
</employee>
</employees>
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}

Syntax

  • Key-Value-Paare
  • Abtrennung von Paaren durch Kommas
  • ganzes JSON-Objekt in geschweiften Klammern
  • JSON-Objekte: { ... }
  • JSON-Arrays: [ ..., ... ]

Datentypen

{
"key": "value",
"text": "Dies ist ein Text!",
"number": 100,
"object": {
"key": "value",
"someNumber": 123,
"someOtherObject": {
"someArray": [
1,
2,
3,
4
],
"someText": "text"
}
},
"array": [
"Anna",
"John"
],
"boolean": true,
"null": null
}

Beispiel

auf JSON Example

[
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters": {
"batter": [
{
"id": "1001",
"type": "Regular"
},
{
"id": "1002",
"type": "Chocolate"
},
{
"id": "1003",
"type": "Blueberry"
},
{
"id": "1004",
"type": "Devil's Food"
}
]
},
"topping": [
{
"id": "5001",
"type": "None"
},
{
"id": "5002",
"type": "Glazed"
},
{
"id": "5005",
"type": "Sugar"
},
{
"id": "5007",
"type": "Powdered Sugar"
},
{
"id": "5006",
"type": "Chocolate with Sprinkles"
},
{
"id": "5003",
"type": "Chocolate"
},
{
"id": "5004",
"type": "Maple"
}
]
},
{
"id": "0002",
"type": "donut",
"name": "Raised",
"ppu": 0.60,
"batters": {
"batter": [
{
"id": "1001",
"type": "Regular"
}
]
},
"topping": [
{
"id": "5001",
"type": "None"
},
{
"id": "5002",
"type": "Glazed"
},
{
"id": "5005",
"type": "Sugar"
},
{
"id": "5003",
"type": "Chocolate"
},
{
"id": "5004",
"type": "Maple"
}
]
},
{
"id": "0003",
"type": "donut",
"name": "Old Fashioned",
"ppu": 0.75,
"batters": {
"batter": [
{
"id": "1001",
"type": "Regular"
},
{
"id": "1002",
"type": "Chocolate"
}
]
},
"topping": [
{
"id": "5001",
"type": "None"
},
{
"id": "5002",
"type": "Glazed"
},
{
"id": "5003",
"type": "Chocolate"
},
{
"id": "5004",
"type": "Maple"
}
]
}
]

Zugriff

Ein Zugriff auf JSON-Werte erfolgt über die Punktnotation.

person = {"name": "John", "age": 30, "city": "New York"};
person.name; // → John
person.age; // → 30

mitarbeiter = {"employees": ["John", "Anna", "Peter"]};
mitarbeiter.employees[0] // → John
mitarbeiter.employees[1] // → Anna
mitarbeiter.employees[2] // → Peter

Dies ist auch geschachtelt möglich:

backwaren[0].name                           // → "Cake"
backwaren[2].id // → "0003"
backwaren[0].batters.batter[0].type // → "Regular"
backwaren[0].batters.batter[0]['type'] // → "Regular"

Solches JavaScript kann auch im Browser unter Entwicklungstools (F12) > Konsole ausgeführt werden.

JavaScript Funktionen

Normaler Zugriff

console.log("Name der ersten Backware: "
+ backwaren[0].name);

Ausgabe:

Name der ersten Backware: Cake

Erste Instanz finden: find(predicate)

console.log("Typ des ersten Teigs: "
+ backwaren.find((backware) => backware.name === "Cake")
.batters.batter[0]
.type);

Ausgabe:

Typ des ersten Teigs: Regular

Array-Elemente verändern: map(callbackFunction)

console.log("Alle Typen der Teige der ersten Backware: "
+ backwaren[0]
.batters
.batter
.map(batter => batter.type)
.join(", ")
)

Ausgabe:

Alle Typen der Teige der ersten Backware: Regular, Chocolate, Blueberry, Devil's Food

Array-Elemente mit Trennzeichen verbinden: join(separator?: string)

console.log("Namen und ppu's der drei Backwaren: ");
console.log("> " + backwaren.map(backware => backware.name + ": " + backware.ppu).join(" "));

Ausgabe:

Namen und ppu's der drei Backwaren:
> Cake: 0.55 Raised: 0.6 Old Fashioned: 0.75

Zweidimensionales Array zu eindimensionalem Array umwandeln (flatMap(callback)) und Arrays sortieren (

sort(compareFn?)

console.log("Alle Toppings aller Backwaren: ");

// mit flatMap(callback) Backwaren zu topping-Arrays umwandeln und dann zu einem Array zusammenfassen
const toppings = backwaren.flatMap(backware => backware.topping);

// doppelte Werte durch das erstellen einer Map hinausfiltern
// aus Map wieder Array erstellen: Array.from(iterable: Iterable<{id, type}>)
const uniqueToppings = Array.from(
new Map(toppings.map(item => [item.id, {
id: item.id,
type: item.type
}])).values()
)
// einzigartige Toppings mit sort(compareFn?) sortieren
.sort((a, b) => a.id - b.id);

// Toppings darstellen
console.log(uniqueToppings.map(topping => "> " + topping.id + ": " + topping.type).join("\n"));

Ausgabe:

Alle Toppings aller Backwaren:
> 5001: None
> 5002: Glazed
> 5003: Chocolate
> 5004: Maple
> 5005: Sugar
> 5006: Chocolate with Sprinkles
> 5007: Powdered Sugar