× Aktuálně z oboru

Vychází Game Ready ovladače pro Far Cry 5 [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]
Celá zprávička [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]

JSON: první kroky aneb používáme PHP a jQuery

[ http://programujte.com/profil/4089-zdenek-vecera/ ]Google [ https://plus.google.com/+ZdenekVecera?rel=author ]       22. 3. 2010       55 922×

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í.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2008073101-json-prvni-kroky-aneb-pouzivame-php-a-jquery/ ].