Mozilla Hacks to zbiór artykułów na temat nowych możliwości silnika Gecko w Firefoksie 3.5. Członkowie Aviary.pl zamierzają tłumaczyć co ciekawsze artykuły z Mozilla Hacks na polski. Na Techblogu zacznę od artykułu „Better security and performance with native JSON”, autorstwa Aruna Ranganathana. Oryginalny artykuł i jego tłumaczenie dostępne są na warunkach licencji Creative Commons Attribution 3.0 USA.
Większe bezpieczeństwo i wydajność dzięki natywnej obsłudze formatu JSON
Mechanizm reprezentacji danych JavaScript Object Notation (JSON) szybko stał się nieodzownym narzędziem programisty WWW, umożliwiając aplikacjom w języku JavaScript pobranie i przetworzenie danych w sposób intuicyjny, w skryptach, z prostą hermetyzacją danych. Firefox 3.5 zawiera natywną obsługę JSON-a, udostępnioną przez własność window.JSON obiektu globalnego.
Natywny JSON, wbudowany w maszynę wirtualną JS, stał się możliwy dzięki specyfikacji ECMAScript 5 (specyfikacja w formacie PDF), której inne części również zostały
zaimplementowane w Firefoksie 3.5. Obecnie natywną obsługę JSON-a udostępniają Firefox 3.5 i IE8, można się też spodziewać, że i inne przeglądarki wkrótce będą miały ją zaimplementowaną.
Natywna obsługa formatu JSON ma dwie zalety:
- Bezpieczeństwo. Korzystanie z funkcji
eval do wyznaczenia wartości wyrażeń zwróconych jako ciągi znaków nie jest bezpieczne. Ponadto, natywny JSON obsługuje wyłącznie dane. Nie można go użyć do przetworzenia obiektów zawierających wywołania metod – spowoduje to zgłoszenie błędu.
- Wydajność. Przetwarzanie JSON-a przy użyciu zewnętrznych skryptów i bibliotek jest zwykle znacznie wolniejsze niż natywne przetwarzanie JSON-a przez przeglądarkę.
Oto kilka przykładów.
API JSON do wyszukiwania może wyglądać jak poniżej:
/*
Załóżmy, że dane w zmiennej data
zostały otrzymane z serwera.
Dla przejrzystości, wyświetlamy
je tutaj w osobnych liniach.
*/
var data = ' { "responseData":
{"results": [
{
"SafeSearch":"true",
"url":"http://www.arunranga.com/i.jpg",
},
{
"SafeSearch":"false",
"url":"http://www.badarunranga.com/evil.jpg",
}
]}}';
Takie zasoby mogły zostać zwrócone na przykład przez proste żądanie HTTP GET z wykorzystaniem API typu REST.
Dzięki natywnemu JSON-owi, można napisać taki kod:
/*
Pobranie uchwytu do ww. zasobu JSON.
Najwygodniej zrobić to za pomocą
zewnętrznych bibliotek obsługujących
natywnego JSON-a.
*/
if (window.JSON) {
var searchObj = JSON.parse(data);
for (var i=0; i++; i < searchObj.responseData.results.length) {
if (searchObj.responseData.results[i].SafeSearch) {
var img = new Image();
img.src = searchObj.responseData.results[i].url;
// ... Wstaw obrazek do drzewa DOM ...
}
}
Dzięki metodzie stringify można obiekt z powrotem zserializować (przekształcić do ciągu znaków w formacie JSON – przyp. tłum.):
// Powrót do wyjściowej sytuacji
var data = JSON.stringify(searchObj);
// zmienna 'data' zawiera teraz pierwotny ciąg znaków
Oczywiście, aby w pełni skorzystać z możliwości JSON-a, warto spróbować pobierać dane JSON z innych domen, poprzez mechanizmy callback takie jak JSONP. (JSONP nie skorzysta z natywnego JSON-a, nie wiem, czemu artykuł oryginalny o nim tu wspomina – przyp. tłum.). Wielu programistów raczej nie będzie korzystać z obiektu JSON bezpośrednio. Najczęściej korzystać oni będą z mechanizmów udostępnianych przez biblioteki takie jak Dojo i jQuery. Biblioteki te ułatwiają odbieranie i przetwarzanie zasobów JSON z różnych domen i udostępniają wiele “cukru składniowego” dla procesu wywołań callback i manipulacji drzewem DOM.
Natywna implementacja JSON-a współpracuje z popularną biblioteką json2.js (która prawidłowo rozpoznaje, czy dostępna jest natywna obsługa JSON-a), dzięki czemu programiści mogą bez problemu korzystać z przetwarzania JSON-a w przeglądarkach bez natywnej jego obsługi (API zdefiniowane w json2.js jest identyczne z natywnym API omawianym w tym artykule – przyp. tłum.). W chwili pisania tego artykułu, Dojo i jQuery ogłosiły, że będą wspierać natywną obsługę JSON-a: