Blog webdeveloperski Patryk yarpo Jar

JSON – format wymiany danych

Autor wiadomości Marzec 6, 2011

JSON jest lekkim formatem wymiany danych opartym o literał obiektowy. Nie jest to zatem nowa technologia czy nowy język co inne spojrzenie na to co już istniało. Być może nawet samo odkodowanie tego skrótu da już nam dużo więcej informacji: "Java Script Object Notation", czyli "Obiektowa notacja Javascript". JSON jest podzbiorem JavaScript. Zatem każdy kod JSON musi być poprawnym kodem JS (każdy JSON jest poprawnym literałem obiektowym, ale nie każdy literał obiektowy jest poprawnym JSON).

Literał obiektowy, na ktorym bazuje format JSON może być wykorzystany np. do tworzenia obiektów. JSON służy do wymiany danych, zastępując z sukcesem na tym polu XML.

JSON może być szybko przetworzony w JS za pomocą funkcji `eval'. Jeśli nie znasz zasad tworzenia literałów obiektowych to warto zapoznać się z wpisem:

Może zatem przykład danych w XML

<?xml version="1.0" encoding="utf-8"?>
<dane>
	<user>
		<imie>jan</imie>
		<nazwisko>Kowalski</nazwisko>
	</user>
	<user>
		<imie>Piotr</imie>
		<nazwisko>Nowak</nazwisko>
	</user>
</dane>

Te same dane w JSON

{
    "dane" : {
        "user" : [
        {
            "imie" : "Jan",
            "nazwisko" : "Kowalski"
        },
        {
            "imie" : "Piotr",
            "nazwisko" : "Nowak"
        }]
    }
}

Na stronie http://jsonlint.com/ można sprawdzić, czy ciąg znaków jest poprawnym kodem JSON. Pamiętaj, że sam fakt iż funkcja `eval' przekształci ciąg znaków w formacie zbliżonym do JSON w rzeczywisty kod jeszcze nic nie znaczy. `eval' potrafi poradzić sobie z nieporpawnym JSONem, który jest poprwanym kodem JS.

Uwaga: JSON powinien zawierać zestaw pól:

"klucz" :  wartość,

Schemat JSONźródło: http://www.json.org/json-pl.html (zajrzyj i poczytaj inne schematy)

(Dziękuję Rafałowi Kukawskiemu za słuszne uwagi w komentarzu)

Choć przesłany ciąg znaków w postaci "wartość" jest także poprawnym kodem JSON (jest to JSONvalue, dokładniej JSONText).

W JSON klucz musi być podany w cudzysłowie (apostrofy powodują, że JSON przestaje być poprawny).

Przyjmijmy, że stosując Ajax takie dane otrzymujemy jako wynik działania skryptu na serwerze. W przypadku XML pewnie skorzystamy z pola responseXML i następnie będziemy się bawić z odpowiednim pobieraniem danych – dla początkujące może to być naprawdę niezbyt przyjemne (jeśli się korzysta z "gołego" obiektu XMLHttpRequest). W przypadku JSONa, polecałbym coś takiego:

// var oXmlHttpRequest = instancja obiektu XMLHttpRequest
// wyslanie zadania na serwer i uzyskanie tekstowej odpowiedzi
var json_tekst = oXmlHttpRequest.responseText;
var json_obiekt = eval( "(" + json_tekst + ")" );

for (var i=0;  i &lt; json_obiekt.dane.user.length; i++)
{
    alert(json_obiekt.dane.user[i].imie + ' ' +
          json_obiekt.dane.user[i].nazwisko);  

Zamiast funkcji `eval' warto zastanowić się nad użyciem bardziej wyrafinowanego parsera JSON:

Warto przeczytać:

Komentarze (4) Trackbacks (0)
  1. Tak dla ścisłości. Zaprezentowany w poście fragment nie jest poprawnym JSONem. Format JSON wymaga, aby nazwy kluczy były łańcuchami.

    {"dane":{"user":[{"imie":"Jan","nazwisko":"Kowalski"},{"imie":"Piotr","nazwisko":"Nowak"}]}}

    Funkcji eval() jest obojętne, czy przekazana wartość jest zgodna ze specyfikacją JSONa, wystarczy, że składnia będzie poprawnym zapisem kodu JavaScript, ale już dla parsera (np. natywnego JSON.parse) wskazana różnica ma wielkie znaczenie.
    Proponuję też nie utożsamiać literału obiektowego z formatem JSON, bo to znowu może prowadzić do nieporozumień wśród początkujących JavaScriptowców. Liczba 3.14 i tekst “lorem ipsum” też są poprawnymi wartościami w formacie JSON.

    Stosowanie eval() swoją drogą jest pójściem na skróty. Poprawnie powinno się użyć właśnie parsera. Jak nie ma natywnego, to zawsze można użyć skryptu Douga Crockforda.

  2. Masz rację, jeśli chodzi o podawanie nazw – powinny być to ciągi znaków. Już poprawiam 🙂

    http://www.json.org/json-pl.html [szczególnie: http://www.json.org/object.gif ]

    Wg tego, co pokazują schemty na stronie Crockforda [powyższe linki] jednak JSON musi mieć minimalną strukturę:
    { }

    Jeśli błędnie odczytuję zawarte tam schematy, proszę o korektę, co robię nie tak 🙂

    pozdrawiam

  3. Sprawdzałem dzisiaj w Mocnych Stronach JS by D. Crockford.
    Wszystkie przykłady, gdzie jest mowa o JSON posiadają “uszy”. Tam gdzie mowa o literałach obiektowych “uszu” nie ma.

  4. Nie dała mi spokoju sprawa, więc zasięgnąłem innych źródeł niż sam RFC. Specyfikacja Ecma-script 5, w rozdziale 15.12 mówi coś takiego

    The JSON interchange format used in this specification is exactly that
    described by RFC 4627 with two exceptions:
    • The top level JSONText production of the ECMAScript JSON grammar may consist of any JSONValue rather than being restricted to being a JSONObject or a JSONArray as specified by RFC 4627.

    Stąd wynikają różnice w przeglądarkowych parserach w stosunku do RFC opisującego JSON.


Leave a comment

 

Brak trackbacków.