JSON

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

JSON, JavaScript Object Notation (wym. ˈdʒeɪsən) – lekki format wymiany danych komputerowych. JSON jest formatem tekstowym, będącym podzbiorem języka JavaScript. Typ MIME dla formatu JSON to application/json. Format został opisany w dokumencie RFC 4627.

Pomimo nazwy JSON jest formatem niezależnym od konkretnego języka. Wiele języków programowania obsługuje ten format danych przez dodatkowe pakiety bądź biblioteki. Wśród nich są ActionScript, C, C++, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, R, REBOL oraz Ruby.

Wykorzystanie[edytuj | edytuj kod]

JSON jest jednym z nieformalnych sposobów przekazywania danych do aplikacji opartych o AJAX. W typowych przypadkach dane w formacie JSON są pobierane z serwera jako tekst przy wykorzystaniu obiektu XMLHttpRequest języka JavaScript, a następnie przekształcane w obiekt. Tekst powinien być kodowany za pomocą UTF-8, który jest w JSON domyślny.

 var http_request = new XMLHttpRequest();
 var url = "http://serwer.pl/to/jest/tylko/test"; // adres z danymi w formacie JSON
 
 // pobierz dane w formacie JSON z serwera
 http_request.onreadystatechange = handle_json;
 http_request.open("GET", url);
 http_request.send(null);
 
 function handle_json() {
        if (http_request.readyState == 4) {
                if (http_request.status == 200) {
                        var json_data = http_request.responseText; // pobranie tekstu
                        var the_object = eval("("+json_data+")");  // zamiana tekstu na obiekt JSON
                } else {
                        alert('Wystąpił problem z wybranym adresem URL.');
                }
                http_request = null;
        }
 }

Powyższy kod jest znacząco uproszczony. Wykorzystany w tym przykładzie obiekt XMLHttpRequest nie jest dostępny we wszystkich przeglądarkach. W normalnych warunkach używa się dodatkowych funkcji lub metod przejściowych.

Przykład[edytuj | edytuj kod]

 {"menu": {
   "id": "file",
   "value": "File",
   "popup": {
     "menuitem": [
       {"value": "New", "onclick": "CreateNewDoc()"},
       {"value": "Open", "onclick": "OpenDoc()"},
       {"value": "Close", "onclick": "CloseDoc()"}
     ]
   }
 }}

Powyższe dane zapisane w XML-u:

 <menu id="file" value="File">
   <popup>
     <menuitem value="New" onclick="CreateNewDoc()" />
     <menuitem value="Open" onclick="OpenDoc()" />
     <menuitem value="Close" onclick="CloseDoc()" />
   </popup>
 </menu>

Porównanie z XML-em i innymi językami znaczników[edytuj | edytuj kod]

Dostęp do danych w formacie JSON jest bardziej naturalny z poziomu języka JavaScript niż dostęp do tych samych danych w formacie XML, ponieważ JSON stanowi składniowy podzbiór języka JavaScript. Wbrew podobieństwu w nazwie nie jest już jednak tak naturalny dla Javy i wymaga stosowania specjalnych bibliotek. Ponadto w starych przeglądarkach może występować problem z analizą JSON-a (zobacz poniższą sekcję), podczas gdy analiza XML przy przesyłaniu z zastosowaniem AJAX jest wbudowane w prawie wszystkie współczesne przeglądarki (chociaż sama implementacja AJAX nie jest spójna).

XML był początkowo jedynym językiem w usługach sieciowych, a więc dominującym przy sformalizowanej wymianie danych. Jednak w nowszych wersjach standardów dopuszczana jest także wymiana danych za pomocą JSON-a (np. w REST).

XML może być łatwiejszy przy czytaniu dowolnego fragmentu dokumentu - ze względu na nazwę znacznika widoczną także w końcowym znaczniku. Jednak z tego samego względu XML w praktyce zajmuje znacząco więcej miejsca niż analogiczny obiekt przesyłany za pomocą formatu JSON. Ilość przesyłanych danych jest z kolei szczególnie istotna w związku z rozwojem urządzeń mobilnych (w szczególności smartfonów).

YAML, jest również językiem serializacji danych i stanowi nadzbiór języka JSON. JSON jest od niego jednak łatwiejszy do analizowania składni[1].

JSON.parse i bezpieczeństwo danych w przeglądarkach[edytuj | edytuj kod]

Analiza składniowa (ang. parsing) danych w formacie JSON w JavaScript jest możliwe poprzez funkcję JSON.parse() lub eval(). Bezpieczniejsza jest jednak funkcja JSON.parse(). Zagrożenie polega na tym, że funkcja eval() powoduje wykonanie dowolnego kodu, czyli także takiego, który może być dowolnym poleceniem JavaScript i może spowodować np. że prywatne dane użytkowania zostaną wysłane na zewnętrzny serwer. Funkcja JSON.parse() nie jest na to wrażliwa, ponieważ sprawdza czy analizowany ciąg znaków jest prawidłowy i tylko wtedy przekształca go na obiekt danych.

Należy zwrócić przy tym uwagę, że funkcja JSON.parse() wprowadzona została dopiero wraz z piątą wersją standardu ECMAScript i jest niedostępna w niektórych, używanych jeszcze, przeglądarkach internetowych[2]. Dla starszych przeglądarek (np. Internet Explorer 7 oraz 6) można jednak użyć darmowych zastępników[3].

Zobacz też[edytuj | edytuj kod]

Przypisy

Linki zewnętrzne[edytuj | edytuj kod]