Neznáte nebo se bojíte moderního formátu JSON? V článku vám ukážu, jak lze s JSON pracovat v PHP. Dozvíte se rozdíly oproti XML a uvidíte, jak využít jQuery pro zpracování předaných dat.
Co jsou XML a JSON?
Moderní způsoby, jak vyměňovat textová data. XML (Extensible Markup Language) je naprostý standard – tím teď nemyslím z pohledu specifikace, ale podle rozšířenosti. XML naleznete prakticky všude, kde se přenáší textová data.
JSON (JavaScript Object Notation) je oproti XML využívaný především moderními AJAX aplikacemi; vznikl jako odlehčená náhrada za XML. JSON využívají Twitter, Facebook, Delicious aj. Je schopný pojmout pole hodnot, objekty, řetězce a čísla, tedy prakticky bez jakéhokoliv omezení.
Hodnoty jsou uváděny v uvozovkách, data je proto nutné escapovat (escapování je běžné také u SQL dotazů [ http://blog.zdenekvecera.cz/item/jak-na-to-sql-injection-magic_quotes_gpc-addslashes-a-stripslashes ]).
Výhody a nevýhody JSON oproti XML
Hlavní výhoda JSON oproti XML je menší velikost přenášených dat. Uvádí se, že obsah XML je až ze 40 % tvořen značkami a atributy. U malých projektů menší traffic nepocítíte, u velkých ano. Následně se projeví v úspoře finančních prostředků.
A nevýhody? Za nevýhodu lze možná považovat nemožnost definovat znakovou sadu přenášeného obsahu, což samo o sobě ale nemusí být jako nevýhoda chápáno. Výchozí kódování je moderní UTF-8.
Jak vygenerovat JSON data v PHP?
Jednoduše. Vytvoříte pole s daty, které nakonec předáte jako parametr funkci json_encode() [ http://php.net/manual/en/function.json-encode.php ]. Ta vrátí data v JSON formátu.
$ret = array();
$ret['stav'] = 0;
$ret['text'] = 'Musíš se přihlásit';
$ret['citat'] = '"Lépe pozdě, než nikdy."';
echo json_encode($ret);
Vypíše:
{"stav":0,"text":"Mus\u00ed\u0161 se p\u0159ihl\u00e1sit","citat":"\"L\u00e9pe pozd\u011b, ne\u017e nikdy.\""}
Jak je vidět, escapování znaků json_encode() provádí automaticky.
Jak zpracovat JSON data v PHP?
Nyní naopak. Vygenerovaný JSON řetězec uložíme do proměnné a zpracujeme funkcí json_decode().
$json_string = '{"stav":0,"text":"Mus\u00ed\u0161 se p\u0159ihl\u00e1sit","citat":"\"L\u00e9pe pozd\u011b, ne\u017e nikdy.\""}';
$json = json_decode($json_string, true);
// array (
// 'stav' => 0,
// 'text' => 'Musíš se přihlásit',
// 'citat' => '"Lépe pozdě, než nikdy."',
// )
var_export($json);
echo $json['citat']; // "Lépe pozdě, než nikdy."
Jak zpracovat JSON data? (JavaScript)
Funkce eval() a bezpečnostní riziko
Protože formát JSON dat je „formát javascriptového objektu“, stačí zavolat funkci eval() a předat jí JSON data. Následně z dat vytvoří standardní javascriptové pole. Žádnou vědu v tom nehledejte.
Možnou nevýhodou je potenciální bezpečnostní riziko – eval() provede, co jí předáte. Pokud jí předáte nebezpečný kód, vykoná jej, neprovádí totiž kontrolu na platnost JSON dat (z logiky věci ani nemůže – nemá přímo s JSON vůbec nic společného).
Máte následující JSON řetězec (v xhr.responseText):
[1, 20, 30, alert('BAF')]
Předáte ho ke zpracování JSON:
var json = eval("(" + xhr.responseText + ")");
Vyskočí ale alert() okno s hláškou „BAF“, což je špatně. Pokud by byl řetězec alert('BAF') v uvozovkách, tento problém nenastane. Data vygenerovaná pomocí json_encode() uvozovky přidávají.
Řešením je v každém případě napřed ověřit platnost dat:
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + text + ')');
Příklad pochází z RFC4627 [ http://www.ietf.org/rfc/rfc4627.txt?number=4627 ].
Nativní podpora přímo v prohlížečích
Některé prohlížeče nabízejí nativní podporu formátu JSON, jsou to: Chrome 3+ (a Safari), Internet Explorer 8+, Firefox 3.5+ a Opera 10.5+
Zpracování přímo pomocí nativních funkcí je rychlé (a snad i rychlejší než eval() [ http://encosia.com/2009/07/07/improving-jquery-json-performance-and-security/ ]).
Podporu pro nativní JSON v prohlížečích nabízejí populární javascriptové frameworky Yahoo! UI Library, jQuery, Dojo Toolkit a Mootools.
Jak zpracovat JSON data pomocí jQuery? (JavaScript)
// v xhr.responseText máme JSON data
var ret = $.parseJSON(xhr.responseText);
alert(ret['citat']); // "Lépe pozdě, než nikdy."
Více na jQuery .parseJSON [ http://api.jquery.com/jQuery.parseJSON/ ]. Pokud pracujete s AJAX přes jQuery, můžete přímo využít jQuery.getJSON [ http://docs.jquery.com/Ajax/jQuery.getJSON ].
Jak bylo zmíněno výše, využívá nativní podporu JSON v prohlížečích – pakliže existuje. Jestli neexistuje, použije [ http://dev.jquery.com/ticket/4429 ] eval(), bohužel.
Jak vypsat všechna JSON data pomocí jQuery? (JavaScript)
// v xhr.responseText máme JSON data
var ret = $.parseJSON(xhr.responseText);
$.each(ret, function(key, value) {
alert(key + ': ' + value);
});
Více na jQuery.each [ http://api.jquery.com/jQuery.each/ ].
Jak zpracovat XML data pomocí jQuery? (JavaScript)
Jen na ukázku výpis citátu z XML dat:
// v xhr.responseXML máme XML data
var xml = xhr.responseXML;
alert($(xml).find("citat").text()); // "Lépe pozdě, než nikdy."
Pokud jste doposud o JSON neslyšeli, anebo se mu bránili, podívejte se na něj blíže. Jedná se o moderní formát, který stojí za prozkoumání.