Javascript JSON Object, JSON Array of Objects

Javascript JSON Arrays

Ein JSON-Objekt besteht aus Eigenschaften eines einzelnen Elements, JSON-Arrays speichern ganze Gruppen von ähnlichen Elementen. JSON stellt strukturierte Daten auf der Basis der Javascript-Syntax von Objekten dar.

JSON Object, JSON Array

JSON basiert auf zwei Datenstrukturen: Objekten und Arrays. Ein Objekt besteht aus Name-Wert-Paaren, ein Array ist eine Liste von Werten, die selber Objekte sein können.

JSON-Objekte ähneln Javascript-Objekten, aber JSON-Objekte können keine Funktionen als Wert enthalten. Wenn ein JSON-Objekt beschrieben wird, liegt ein normales Javascript-Objekt vor, das aus einem JSON-String deserialisiert wurde und das wieder als JSON-String serialisiert werden kann.

const obj = { 
   "name" : "Wanderlust" , "children" : [ 
      {"tour":"Frankreich"}, 
      {"tour":"Devon"} 
    ]
};
const jsonArr = [
   { "name" : "Wanderlust", "children" : [ 
      { "tour" : "Frankreich" },
      { "tour" : "Devon" }
   ]},
   { "name" : "Fahrradtouren", "children" : [ 
       { "tour" : "Ostseeküste" },
       { "tour" : "Friesland" }
   ]}
];
console.log (jsonObj.tour1 )      > Frankreich
console.log (jsonArr[1].name)     > Fahrradtouren

jsonArr[1].children.push({"tour":"Emmerich"});

console.log (jsonArr[1].children)

jsonArr[1].children – [{tour: "Ostseeküste"}, {tour: "Friesland"}]

Wie schon erwähnt: Das Schöne an JSON Arrays sind die bequemen Array-Methoden: array.push() hängt neue Elemente direkt an das JSON-Array an.

data.push (jsonArr);

JSON aus Datei einlesen

Der einfachste Weg, eine JSON-Datei einzulesen, ist Javascript fetch (). Javascript allein reicht schon und keine serverseitige Anwendung muss beispringen.

function appendData (data) {
   console.log (data);
   document.querySelector ("div").innerHTML = JSON.stringify(data);
}

fetch ("data.json").then (function (response) {
   return response.json();
}).then (function (data) {
   appendData (data);
}).catch (function (error) {
   console.log ("error: " + error);
});

		

JSON Datei speichern

Um JSON auf dem Server zu speichern, wird NodeJS mit dem FS-Modul benötigt oder JSON muss an ein serverseitiges Script (meist PHP) übergeben werden.

Anders als beim Lesen der JSON-Datei mit dem einfachen fetch("data.json") braucht fetch() jetzt die URL der Anwendung und die Optionen POST, headers und body.

function saveToServer (data)  {
	const jsonArr = {"name":"Wanderlust","children":[{"name":"Frankreich"},{"name":"Devon"}]};
	data.push (jsonArr);

    window.fetch ("update.php", {
    	method: 'post',
    	headers: {'Content-Type' : 'application/json'},
    	body: JSON.stringify(data)
    })
    .then ( (text) => {
    	// log response text 
    	console.log (text);
    })
    .catch ((error) => {
    	console.log ("Error 04: ", error)
    })
}

Ein einfaches Beispiel für eine PHP-Anwendung auf dem Server

<?php
$json = file_get_contents("php://input");

if (!empty($json)) {
	$data = json_decode($json, true);
} else {
	echo "Error 01: JSON data empty";
	die;
}

// Wenn die Datei data.json noch nicht existiert, wird sie als leere Datei angelegt
$jsonfile = "./data.json";
if (!file_exists ($jsonfile)) {
	file_put_contents($jsonfile, '');
}

if ( file_put_contents ($jsonfile, json_encode($data))) {
	echo "Data {$jsonfile} successfully saved";
} else {
	echo "Error 02: Could not save {$jsonfile}";
}

JSON.stringify

stringify () ist eine eingebaute Funktion, die aus einem Objekt oder Array einen JSON-String erzeugt, z.B. um Daten an eine Anwendung durchzureichen.

JSON.stringify(value, replacer, space)
value
Wert, der in einem JSON-String umgewandelt werden soll
replacer (optional)
Eine Funktion oder ein Array, das als Filter wirkt. Beides wird auf jedes Element angewendet.
space (optional)
Steuert den Leerraum im String und kann ein String oder Zahl sein. Eine Zahl wird als Anzahl von Zeichen für das Einrücken interpretiert.
let jsonString = JSON.stringify(json, null, ".");
elem.innerHTML = jsonString;



Nested JSON-Array in nested HTML list

Häufiger als die Ausgabe des JSON-Strings wird ein JSON-Array auf Webseiten als verschachtelte Liste dargestellt.

let nestedList = function(container, json) {
  const ul = document.createElement('ul');
    
  json.forEach (function (elem, item) {
  	const row = json[item];
    
    const li = document.createElement('li');
    li.textContent = row.name;
    let nodes = row.children;
    if(nodes && nodes.length) {
      nestedList(li, nodes);
    }
    
    ul.appendChild(li);
  });  
  container.appendChild(ul);
};

var container = document.querySelector(".json");  
nestedList(container, json);

Weil man bei den verschachtelten JSON-Objekten in JSON-Arrays immer wieder vor der Frage steht, ob es sich bei einer Struktur gerade um ein Array handelt, ist Array.isArray () eine willkommene Hilfestellung.