# $.getJSON()

Met `$.getJSON()` kunnen we enkel gegevens in JSON-formaat ophalen. Filteren kan enkel via de GET-methode.

Response: JSON en JSONP. Syntax:\
`$.getJSON(url [, data] [, callback]).done(callback).fail(callback).always(callback)`

* **URL**: &#x20;

  De URL van het op te halen bestand.
* **Data**: &#x20;

  Een string of een map waarmee we de gegevens op de URL kunnen filteren. (Een map wordt binnen de functie automatisch omgezet naar een string.)  &#x20;

  Aangezien we in dit hoofdstuk geen server-side script gebruiken, kunnen we deze parameter in deze oefeningen nog niet verwerken.
* **Callback**: &#x20;

  Deze functie wordt uitgevoerd zodra alle gegevens zijn opgehaald.
* **.done(callback)** (optioneel): &#x20;

  Ook deze functie wordt uitgevoerd zodra alle gegevens zijn opgehaald, maar deze bevat GEEN data.
* **.fail(callback)** (optioneel): &#x20;

  Deze functie wordt enkel uitgevoerd indien er iets nies loopt (URL niet bereikbaar, timeout, ...).
* **.fail(callback)** (optioneel): &#x20;

  Deze functie wordt altijd uitgevoerd.

JSON is een relatief nieuw formaat, maar wint aan populariteit ten opzichte van XML. Daarom gaan we dit formaat iets gedetailleerder bespreken.

Een JSON-object kan enkel waardes bevatten (een *array*) of kan complexe naam/waardeparen (een *object*) bevatten. Elk van deze gegevensstructuren wordt aan de hand van een oefening verduidelijkt.

## $.getJSON(): JSON met een eenvoudige literal array

{% hint style="success" %}
★ Open **ajaxLokaal/data/bloemen1.json** en **ajaxLokaal/json1.html**.\
★ Bekijk de broncode en test het resultaat in een browser.
{% endhint %}

Het JSON-object bevat vijf waardes.

`["Anjer","Lelie","Narcis","Roos","Tulp"]`

```markup
<h2>Aantal items: <span id="aantal"></span> </h2>
<section id="data">
    <ul id="bloemenlijst"></ul>
</section>
...
<script>
$(function () {
    $.getJSON('data/bloemen1.json', function (data) {
        console.log('first success');
        console.log('data', data);
        console.log('data[0]', data[0]);
        $('#aantal').text(data.length);
        $.each(data, function (index, value) {
            $("#bloemenlijst").append('<li>' + this + '</li>\n\t');
        });
    }).done(function () {
        console.log('second success');
    }).fail(function (err) {
        console.log('error', err);
    }).always(function () {
        console.log('complete');
    });
});
</script>
```

*Json1.html* leest de array uit *bloemen1.json*. De parameter *data* in de callback functie bevat de array.

U kan deze waarde van data makkelijk uitlezen.\
Bijvoorbeeld: de code `console.log('data', data);` toont de volledige array in het consolevenster van de browser.

`data.length` berekent het aantal items in de array. Deze waarde wordt achteraan de h2-tag toegevoegd.

De methode `$.each()` doorloopt alle items in de array en plaatst de waarde telkens in een nieuwe li-tag.

Ziehier het resultaat:

![JSON met een eenvoudige literal array](https://1796208354-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9o5lSfK7vREgzWjB4s%2F-LAX7w2Vgvd3Asf6Slxd%2F-L9sHOczxVoGncftlfUs%2FgetJson1.png?generation=1524212435162166\&alt=media)

## $.getJSON(): JSON met één object

{% hint style="success" %}
★ Open **ajaxLokaal/data/bloemen2.json** en **ajaxLokaal/json2.html**.\
★ Bekijk de broncode en test het resultaat in een browser.
{% endhint %}

Het JSON-object bevat opnieuw informatie over vijf bloemen, maar elke bloem heeft nu een *titel* en een *url*.

```javascript
[
    {"titel": "Anjer","url": "http://nl.wikipedia.org/wiki/Anjer"},
    {"titel": "Lelie","url": "http://nl.wikipedia.org/wiki/Lelie"},
    {"titel": "Narcis","url": "http://nl.wikipedia.org/wiki/Narcis"},
    {"titel": "Roos","url": "http://nl.wikipedia.org/wiki/Rozen"},
    {"titel": "Tulp","url": "http://nl.wikipedia.org/wiki/Tulp"}
]
```

```markup
<h2>Aantal items: <span id="aantal"></span> </h2>
<section id="data">
    <ul id="bloemenlijst"></ul>
</section>
...
<script>
$(function () {
    $.getJSON('data/bloemen2.json', function (data) {
        console.log('data', data);
        console.log('data[0].titel :', data[0].titel);
        $('#aantal').text(data.length);
        $.each(data, function (index, value) {
            $("#bloemenlijst").append('<li><a href="' + this.url + '">' + this.titel + '</a></li>\n\t');
        })
    }).fail(function (err) {
        console.log('error', err);
    });
});
</script>
```

De parameter *data* bevat nu een **array** van vijf **objecten** (zie console).

![JSON met één objecten](https://1796208354-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9o5lSfK7vREgzWjB4s%2F-LAX7w2Vgvd3Asf6Slxd%2F-L9sHOnmjq4AFZy07kz3%2FgetJson2.png?generation=1524212436963404\&alt=media)

Kijk even terug naar hoofdstuk 2. Binnen een constructor functie verwijst het kernwoord *this* naar het object. Binnen de each-lus lezen we met `this.titel` en `this.url` de waardes van elk object uit en voegen we deze toe aan de lijst *bloemenlijst*.

## $.getJSON(): JSON met meerdere objecten

{% hint style="success" %}
★ Open **ajaxLokaal/data/bloemen3.json** en **ajaxLokaal/json3.html**.\
★ Bekijk de broncode en test het resultaat in een browser.\
★ Bekijk de JSON-structuur.
{% endhint %}

```javascript
{
    "bloemzaden": [
        {"titel": "......","omschrijving": "....."},
        {"titel": "......","omschrijving": "....."},
        ....
    ],
    "bloem": [
        {"titel": "...","foto": "...","url": "...","omschrijving": "..."},
        {"titel": "...","foto": "...","url": "...","omschrijving": "..."},
        ...
    ]
}
```

```markup
<section>
    <ul id="bloemzadenlijst"></ul>
</section>
<section class="sjabloon drop-shadow">
    <h2>titel</h2>
    <img src="../assets/fotos/thumb_roos.jpg">
    <div>Omschrijving</div>
    <p><a href="#">Meer info</a></p>
    <div class="reset"></div>
</section>
...
<script>
    $(function () {
        $.getJSON('data/bloemen3.json', function (data) {
            console.log('data', data);
            console.log('data.bloemzaden', data.bloemzaden);
            console.log('data.bloem', data.bloem);
            console.log('data.bloem[0].titel :', data.bloem[0].titel);
            // bloemzaden
            $.each(data.bloemzaden, function (index, value) {
                $("#bloemzadenlijst").append('<li><strong>' + this.titel + '</strong><br>' + this.omschrijving + '</li>\n\t');
            });
            // bloemen
            $.each(data.bloem, function (index, value) {
                $('.sjabloon').clone()
                    .find('h2').text(this.titel).end()
                    .find('div:first').html(this.omschrijving).end()
                    .find('a').attr('href', this.url).end()
                    .find('img').attr('src', '../assets/fotos/' + this.foto).end()
                    .removeClass('sjabloon').insertBefore('.sjabloon');
            });
            $('.sjabloon').remove();
        }).fail(function (err) {
            console.log('error', err);
        });
    });
</script>
```

De parameter *data* bevat één samengesteld object. De verschillende deelobjecten kan u met de puntnotatie benaderen. `data.bloemzaden` is een array van drie objecten, `data.bloem` een array van vijf objecten.

Het eerste deelobject `data.bloemzaden` wordt, naar analogie met voorgaande oefening, in een lijst getoond.

Om het object `data.bloem` makkelijk te formatteren, maken we gebruik van het sjabloon (de section-tag met class *.sjabloon*). In de each-lus staat maar één statement! Om de code leesbaar te houden, wordt het statement verdeeld over meerdere lijnen.

Binnen de lus maken we een kopie van het sjabloon. De methode `find()` selecteert telkens één element binnen de section-tag en vult deze met de waardes uit het object. Op het einde van de ketting wordt de class *.sjabloon* verwijderd. Na het beëindigen van de lus wordt het originele sjabloon gewist.

Ziehier het resultaat:

![JSON met meerdere objecten](https://1796208354-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9o5lSfK7vREgzWjB4s%2F-LAX7w2Vgvd3Asf6Slxd%2F-L9sHQWM_B6pAry6sogH%2FgetJson3.png?generation=1524212435983600\&alt=media)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://1itf.gitbook.io/jquery/10-ajax-zonder-server-side-scripting/usd.getjson.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
