JSON - Data ophalen uit lokale JSON bestanden
Home

JSON - Data ophalen uit lokale JSON bestanden

JSON - Data ophalen uit lokale JSON bestanden

Het kan handig zijn om gegevens op te slaan in JSON formaat. In deze les leer je één JSON inleest en hoe je meerdere JSON bestanden asynchroon inleest.

Databasemodel

De beschrijving van het databasemodel vind je op VOS - ERD.

Database gegevens inlezen

Om een lokaal bestand in te lezen kunnen we de Ajax klasse gebruiken. Dezelfde klasse die we later zullen gebruiken om de API op de server aan te spreken. Als de bestanden zijn ingelezen slaan we de JSON op in localStorage.

We slaan de hele JSON string op in één localStorage item als string. Om de data gemakkelijk in JavaScript te kunnen manipuleren halen we de JSON string uit de localStorage en zetten die om naar een JavaScript object.

Vervolgens roepen we de loadData methode op wanneer de index.html (op Cloud9 is dat index002.html) pagina in de browser geladen is:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="css/vos.css">
    <link type="text/css" rel="stylesheet" href="css/iconfont.css">
    <title>Veilig op school</title>
    <script type="text/javascript" src="js/modern-ajax.js"></script>
    <script type="text/javascript" src="js/json-inlezen.js"></script>
    <script>
        window.onload = function() {
            loadData();
        }
        window.location.href = '#app-index';
    </script>
</head>
<body>
</body>
</html>

De loadData functie maken we in het js/json-inlezen.js bestand. Om deze functie te implemeteren gebruiken we enkele specififieke JavaScript technieken die allemaal het gevolg zijn van het feit dat functies data zijn.

We hebben voor elk JSON bestand dat geladen wordt een andere callback functie nodig. In plaats van een aparte functie te maken voor elke callback, maken we een object met de naam callback. Voor elk type JSON bestand, dat moet moet worden ingelezen, maken we een eigenschap. In die property zit een functie die code bevat die moet worden uitgevoerd nadat het JSON bestand is ingelezen. In een eerste versie lezen we het JSON bestand in en tonen we de inhoud ervan in een pre element.

var callback = {
    procedureListLoaded: function(data) {
        var pre = document.createElement('PRE');
        var t = document.createTextNode(data);
        pre.appendChild(t);
        document.body.appendChild(pre);
    },
    organisationListLoaded: function(data) {
        var pre = document.createElement('PRE');
        var t = document.createTextNode(data);
        pre.appendChild(t);
        document.body.appendChild(pre);
    },
    positionLoaded: function(data) {
        var pre = document.createElement('PRE');
        var t = document.createTextNode(data);
        pre.appendChild(t);
        document.body.appendChild(pre);
    },
    error: function(data) {
        var p = document.createElement('P');
        p.innerHTML = '2 error: ' + data;
        p.style.color = '#ff0000';
        document.body.appendChild(p);
    }
};

Vervolgens gebruiken we de moderne ajax functie om de bestanden in te lezen. We maken gebruik van het feit dat die functie als een promise is geïmplementeerd om de bestanden in de juiste volgorde in te lezen en ervoor te zorgen dat het volgende bestand pas wordt ingelezen als het vorige al is ingelezen. Dan doen we in then property. In de catch property vangen we eventuele fouten op.

$http('data/procedureList.json')
    .get()
    .then(function(data) {
        callback.procedureListLoaded(data);
        var payload = {};
        return $http('data/organisationList.json').get(payload);
    })
    .catch(callback.error)
    .then(function(data) {
        callback.organisationListLoaded(data);
        var payload = {};
        return $http('data/position.json').get(payload);
    })
    .catch(callback.error)
    .then(function(data) {
        callback.positionLoaded(data);
        var payload = {};
        return $http('data/identity.json').get(payload);
    })
    .catch(callback.error)
    .then(function(data) {
        callback.positionLoaded(data);
        var payloadd = {};
        return $http('data/identity.json').get(payload);
    })
    .catch(callback.error);

Als we de pagina index.html (op Cloud9 is dat index002.html) uitvoeren wordt de JSON getoond. Ik heb opzettelijk een fout gemaakt in de eerste url en i.p.v. data/procedureList.json, data/plopperdeplop.json meegegeven:

VOS - JSON inlezen met catch per poging
VOS - JSON inlezen met catch per poging

We willen eigenlijken dat het inlezen stopt vanaf het moment dat het niet lukt om een JSON bestand in te lezen. Het volstaat dan om slechts één catch toe te voegen aan de einde van de lijst.

$http('data/procedureList.json')
    .get()
    .then(function(data) {
        callback.procedureListLoaded(data);
        var payload = {};
        return $http('data/plopperdeplop.json').get(payload);
    })
   .then(function(data) {
        callback.organisationListLoaded(data);
        var payload = {};
        return $http('data/position.json').get(payload);
    })
    .then(function(data) {
        callback.positionLoaded(data);
        var payload = {};
        return $http('data/identity.json').get(payload);
    })
    .then(function(data) {
        callback.positionLoaded(data);
        var payload = {};
        return $http('data/identity.json').get(payload);
    })
    .catch(callback.error);

Als het fout loopt bij het inlezen van het eerste JSON bestand wordt de fout getoond en stopt het inlezen:

VOS - JSON inlezen met 1 catch en fout eerste poging
VOS - JSON inlezen met 1 catch en fout eerste poging

Als het fout loopt bij het tweede bestand wordt de catch onderaan uitgevoerd en de volgende JSON bestanden niet meer getoond:

VOS - JSON inlezen met 1 catch en fout tweede poging
VOS - JSON inlezen met 1 catch en fout tweede poging

Hier volgt de volledige code (js/json-inlezen.js):

var loadData = function() {
    var callback = {
        procedureListLoaded: function(data) {
            var pre = document.createElement('PRE');
            var t = document.createTextNode(data);
            pre.appendChild(t);
            document.body.appendChild(pre);
        },
        organisationListLoaded: function(data) {
            var pre = document.createElement('PRE');
            var t = document.createTextNode(data);
            pre.appendChild(t);
            document.body.appendChild(pre);
        },
        positionLoaded: function(data) {
            var pre = document.createElement('PRE');
            var t = document.createTextNode(data);
            pre.appendChild(t);
            document.body.appendChild(pre);
        },
        error: function(data) {
            var p = document.createElement('P');
            p.innerHTML = '2 error: ' + data;
            p.style.color = '#ff0000';
            document.body.appendChild(p);
        }
    };

    $http('data/procedureList.json')
        .get()
        .then(function(data) {
            callback.procedureListLoaded(data);
            var payload = {};
            return $http('data/plopperdeplop.json').get(payload);
        })
       .then(function(data) {
            callback.organisationListLoaded(data);
            var payload = {};
            return $http('data/position.json').get(payload);
        })
        .then(function(data) {
            callback.positionLoaded(data);
            var payload = {};
            return $http('data/identity.json').get(payload);
        })
        .then(function(data) {
            callback.positionLoaded(data);
            var payload = {};
            return $http('data/identity.json').get(payload);
        })
        .catch(callback.error);
}

JI
2020-05-01 13:55:37