Blog webdeveloperski Patryk yarpo Jar

Parsowanie JSON

Autor wiadomości Grudzień 28, 2011

JSON (ang. JavaScript Object Notation) jest bardzo przyjemnym formatem wymiany danych. W tym wpisie postaram się pokazać kilka sposobów na parsowanie ciągu znaków zgodnego (lub zbliżonego) z JSON. Z zasadami tworzenia poprawnego JSON można zapoznać się na oficjalnej stronie.

Opisane sposoby:

  • funkcja `eval' (natywna funkcja JS - archaiczne rozwiązanie)
  • biblioteka json2 (obiekt `JSON') by Doug Crockford
  • biblioteka json_parse' (funkcja `json_parse')  by Doug Crockford
  • biblioteka json_sans_eval (funkcja jsonParse) by Mike Samuel
  • obiekt JSON = { stringify : function, parse : function } (natywny obiekt JS - nowsze przeglądarki)
  • parser JSON w jQuery
  • parser JSON w Dojo Toolkit

Czym jest poprawny JSON?

Przez poprawny JSON rozumiem ciąg znaków zgodny z:

Funkcja `eval'

Natywna funkcja `eval' jest najprymitywniejszą metodą, często odradzaną z powodu na brak jakiejkolwiek walidacji danych wejściowych.Funkcja ta powoduje wykonanie kodu przekazanego jako ciąg znaków.

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = eval('(' + jsonString + ')');
alert(jsonObj.text);

demo online

Wykorzystując ten sposób warto zawsze ciąg znaków otoczyć jeszcze dodatkowymi nawiasami (jak w przykładzie). Ogólnie należy bardzo uważnie używać tej metody. Najlepiej nie używać jej wcale, jeśli z jakichś powodów nie jest to niezbędne.

Przeczytaj więcej:

Biblioteka json2 - `JSON.parse'

Autorem tego rozwiązania jest Douglas Crockford, twórca formatu JSON. Załączenie odpowiedniego pliku pozwala na wykorzystanie interfejsu obiektu JSON.

Obiekt ten posiada 2 metody:

JSON {
    stringify(value, [replacer [, space]]),
    parse( string[, reviver] )
}

Metoda `stringify' pozwala na zamianę dowolnej wartości na ciąg znaków zgodny z JSON. Metoda `parse' pozwala na działanie w drugą stronę (ciąg znaków JSON -> obiekt JS).

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = JSON.parse(jsonString);
alert(jsonObj.text);

demo online

Drugi parametr metody `parse' pozwala na odpowiednie operacje na danych zawartych w ciągu znaków.

var jsonString = '{"text" : "Witaj świecie!", "day" : "monday"}',
    jsonObj = JSON.parse(jsonString, function (key, value) {
        if ('day' === key && 'monday' === value)
        {
            return 'poniedziałek!';
        }
        return value;
    });
alert(jsonObj.text + " dzień: " + jsonObj.day);

demo online

Powyższy kod pozwala na podmianę wartości pola `day' z "monday" na "poniedziałek!".

Przeczytaj więcej:

Biblioteka json_parse - `json_parse()'

Funkcja `json_parse' przyjmuje  1 lub 2 parametry. Pierwszy to ciąg znaków (który powinien być zgodny z JSON). Drugi to funkcja `reviver' działająca na takiej samej zasadzie jak opisałem wyżej.

var jsonString = '{"text" : "Witaj świecie!"}',
   jsonObj = json_parse(jsonString);
alert(jsonObj.text);

demo online

Analogicznie z wykorzystaniem odpowiedniej funkcji `reviver':

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = json_parse(jsonString, function (key, value)
    {
        if ('day' === key && 'monday' === value)
        {
             return 'poniedziałek!';
        }
        return value;
    });
alert(jsonObj.text);

demo online

Przeczytaj więcej:

Biblioteka json_sans_eval - `jsonParse()'

Według twórców json_sans_eval, funkcja `jsonParse' potrafi parsować nie do końca poprawny kod JSON, jednak nie wykorzystuje do tego funkcji `eval'. należy stosować, gdy zależy nam na szybkości i bezpieczeństwie, a poprawność JSON nie jest priorytetem.

Przykładowe wykorzystanie:

var jsonString = '{"text" : "Witaj świecie!"}',
   jsonObj = jsonParse(jsonString);
alert(jsonObj.text);

demo online

Przeczytaj więcej:

Natywny obiekt JSON

W nowszych przeglądarkach* istnieje natywny obiekt `JSON', który podobnie jak wyżej opisany obiekt `JSON' (json2 autorstwa D. Crockforda) posiada interfejs:

JSON {
    stringify(value, [replacer [, space]]),
    parse( string[, reviver] )
}

Metoda `stringify' pozwala na serializację obiektu JS do JSON. Natomiast `parse' na deserializację (parsowanie ciągu znaków do obiektu).

Skoro interfejs i zasada działania jest taka sama jak w json2, to i kod wygląda tak samo (z tą różnicą, że nie trzeba załączać żadnych zewnętrznych plików):

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = JSON.parse(jsonString);
alert(jsonObj.text);

demo online

A także przykład z  dodatkową funkcją`reviver':

var jsonString = '{"text" : "Witaj świecie!", "day" : "monday"}',
    jsonObj = JSON.parse(jsonString, function (key, value) {
        if ('day' === key && 'monday' === value)
        {
            return 'poniedziałek!';
        }
        return value;
    });
alert(jsonObj.text + " dzień: " + jsonObj.day);

demo online

* - Na stronie kangax.github.com/es5-compat-table znaleźć można tabelę informującą o istnieniu danego obiektu w JavaScript w konkretnej wersji przeglądarki. Nie oznacza to, że obiekt ten działa idealnie oraz, że jest zgodny ze specyfikacją. Dla obiektu JSON test wyglądał następująco:

typeof JSON == 'object'

Przeczytaj więcej:

Parser JSON w jQuery

Jedna z najpopularniejszych (jeśli nie najpopularniejsza) biblioteka JavaScript także posiada metodę pozwalającą na parsowanie formatu JSON.

Jest to metoda jQuery.parseJSON, której kod wygląda w ten sposób (wersja 1.7.1):

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )();

    }
    jQuery.error( "Invalid JSON: " + data );
}

Jak widać, jeśli używana przeglądarka posiada natywny obiekt `JSON' jest on wykorzystywany. W przeciwnym wypadku wykorzystywany jest mechanizm zapożyczony z json2.

Przykładowy kod:

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = jQuery.parseJSON(jsonString);

alert(jsonObj.text);

demo online

Metoda udostępniania przez jQuery nie pozwala na wykorzystanie funkcji `reviver' w sposób opisywany wcześniej.

Przeczytaj więcej:

Parser JSON w Dojo

Dojo Toolkit także posiada odpowiedni moduł odpowiedzialny za pracę z JSON.

Moduł `json' będący częścią Base (`_base/json`) posiada dwie publiczne metody:

  • toJson - serializacja obiektu do formatu JSON (odpowiednik `JSON.stringify')
  • fromJson - parsowanie JSON do obiektu (odpowiedniek `JSON.parse')

`dojo.toJson'

Wykorzystuje `json.stringify' zdefiniowane w module `dojo/json`. Jeśli przeglądarka posiada obiekt `JSON' z poprawnie działającą metodą `JSON.stringify' jest ona wykorzystywana. W przeciwnym wypadku odpowiednia metoda jest tworzona.

`dojo.fromJson'

Jest to jedynie nakładka na natywną funkcję `eval'. Nie posiada żadnej walidacji.

Wykorzystanie `dojo.fromJson':

var jsonString = '{"text" : "Witaj świecie!"}',
    jsonObj = dojo.fromJson(jsonString);
alert(jsonObj.text);

demo online

Przeczytaj więcej:

Walidatory JSON

Lista kilku walidatorów online JSON:

Nowości JSON

Komentarze (0) Trackbacks (0)

Brak komentarzy.


Leave a comment

 

Brak trackbacków.