Džeisonas - Javos Skripto sūnus
Parašė ozzWANTED 2010 kovo 19 07:03:34

Trumpai - kas tai ir su kuo valgoma:
JSON - Kas tai ?
JSON - JavaScript objektų žymėjimo kalba. (JavaScript Objects Notation)

Oficiali galūnė:
*.json

Oficiali MIME deklaracija ( http://www.iana.org/assignments/media-types/application/ ):
application/json
Pvz. <script type="text/x-json"><-script->

Alternatyvos?
XML.

Kas geriau - XML ar JSON?
Atsakymas: XML privalumas - XML schema, portabilumas į WSDL per SOAP ir kitas aplikacijas,
JSON - labiau skirtas vidiniam tinklapio naudojimui, o patį JSON'ą daugiausiai panaudoja AJAX tipo sistemos.

JSON trūkumai - XSS pavojaus galimybė, nėra date tipo formatų. JSON taip pat netinka dideliems *.json
dokumentams parsinti, kadangi visą dokumentą bando apdoroti sykiu, o ne porcijomis rodyklių pagalba.

XML privalumas - XSS atveju, galima bandyti saugotis naudojant XMLSchema su apribotais duomenų tipais.

Bazinis saugumo validatorius - rekomenduojama įvykdyti prieš interpretuoja JSON kodą:

var my_JSON_object = !(/[^,:{}[]0-9.-+Eaeflnr-u nrt]/.test(
text.replace(/"(.|[^"])*"/g, ''))) &&
eval('(' + text + ')');
 

Firefox source kodo bibliotekos - JSON pagrindu, jose yra aprašyti Firefox nustatymai, ir informacija.

Kas gi yra tas piliečio Javos Skripto sūnus - Džeisonas. Ar jis mums reikalingas?

JSON - tai tekstinis, žmogui suprantamas duomenų formatas atvaizduojantis duomenų struktūras ir asociatyvius masyvus.
JSON dažniausiai naudojamas Ajax'o perduoti duomenims ir yra naudojamas kaip XML alternatyva.
Pats paprasčiausias pavyzdys:

{ "vardas": "Dzeisonas",
"adresas":
{
"gatve": "Geliu 3 - 5",
"miestas": "Nida",
"salis": "Lietuva",
},
"telefonas":
[
"8 65 55001",
"8 55 23991"
]
}

JSON viduje gali būti atvaizduoti paprasti kintamieji, asociatyvus masyvas, paprastas masyvas.

Įsitikinimui, jog JSON yra labiau skaitomas ir paprastesnis nei XML, analogišką informaciją XML formatu:

<pagrindinis>
<vardas>Dzeisonas</vardas>
<adresas>
  <gatve>Geliu 3 - 5</gatve>
  <miestas>Nida</miestas>
  <salis>Lietuva</salis>
</adresas>
<telefonas>8 65 55001</telefonas>
<telefonas>8 55 23991</telefonas>

</pagrindinis>

Tiesa, JSON yra labiau human-readable kodas, užimantis mažiau vietos, bet ir pirmas ir antras dažniausiai yra generuojami sistemų, o ne rašomi rankiniu būdų. Taip pat XML yra skirtas būtent sistemoms, lengvesniam išorinių duomenų nusiskaitymui, todėl JSON ar XML dokumento apimtis nėra esminis kriterijus. Tiesa, JavaScript atveju - tai svarbu, nes JS lėtumą per milijoną operacijų smarkiai įtakoja net ir paprastas tarpas ar ilgesnio pavadinimo kintamasis(todėl naudojami PACKER ir pan. dalykai).

Beje, nors pateiktame pavyzdyje visi duomenys yra eilutės tipo, tačiau JSON palaiko ir daugiau kintamųjų tipų: eilutės(string), skaičiai(integer, real), loginės reikšmės(true, false), masyvai(buvo pavyzdyje), objektai(buvo pavyzdyje), NULL.

Kaip apdoroti duomenis gautus tokiu(JSON) formatu? Tam naudojama eval() funkcija.

var kitamasis = eval("(" + JSON_tekstas + ")");

Taip apdoroję duomenis prie jų galime prieiti kintamasis.vardas, kintamasis.adresas.salis kintamasis.telefonas[0].

Viskas labai šaunu ir atrodo labai paprasta. Ar tikrai? Laikas pakalbėti apie trūkumus.
O trūksta datos bei laiko formatų(įdomu kaip iš tokios padėties sukasi naudojantys JSON? Naudoja eilutės tipo kintamuosius ar datos iš viso nenaudoja?)

Kitas aspektas yra saugumas. Kadangi galima paduoti bet ką, tai kodėl gi nepadavus kokios nors funkcijos? Aišku, ta funkcija turėtų būti protingesnė nei tiesiog alert(). Viena iš problemų su kuria gali susidurti naudojantys JSON, tai XSS (ang. cross site scripting). Javascript turi tokią blogą savybę gautą kodą iš karto įvykdyti, todėl niekada negali būti tikras ką gausi iš JSON. Kita problema CSRF (ang. Cross Site Request Fogery), lietuviškai tai reikštų duomenų vagystės, JSON nėra labai saugus ir bet kas gali išparsinti ir pamatyti duomenų turinį, tam net nereikia labai sudėtingų įrankių ar žinių, užtenka Firefox ir keleto standartinių svetainės kūrėjų įskiepių. Daugiau nesiplėsiu saugumo problemų klausimais, paskaitykite nuorodas pateiktas straipsnio pabaigoje.

Apibendrinant, JSON yra labai paprastas ir suprantamas formatas, lengvai realizuojamas programavime. Jeigu jums svarbus perduodamos informacijos dydis, tai jis turi privalumų prieš XML.

Tačiau JSON yra parsinamas JavaScript kompiliatoriaus, kuris yra žymiai lėtesnis nei Php kompiliatorius, todėl jeigu apdorojate pvz. 200MB, išoriniu būdu gautą XML dokumentą, tai be abejonės, rodyklių aritmetikos(pointeriu) pagrindi dirbanti Php klasė - XMLReader() bus žymiai greitesnė ir gebės apdoroti visą dokumentą, nes į jį kreipiasi tik konkrečiais CHUNK'ais bei rodyklėmis. Tuo tarpu JSON, bandys ‚suvalgyti' visą tą 200MB Jūsų xml dokumentą.

Daugiau pasiskaityti galite:
Wikipedia
Oficialiame puslapyje
JSON, AJAX, & PHP
JSON AJAX Web Chat
Mastering JSON
JSON for the masses
JSON is not as safe as people think it is
Look Ma, Cross-Domain Scripting!

---
PAVYZDYS: AJAX+ JSON
JSON kodas, kurį iškviesime AJAX pagalba į mūsų HTML dokumentą:
<li>
 <script type="text/x-json" class="meta-data">
  {
   id: 1
  }
 <-script->
 <a>Click me to get ID</a>
</li>
<li>
 <script type="text/x-json" class="meta-data">
  {
   id: 2
  }
 <-script->
 <a>Click me to get ID</a>
</li>
<li>
 <script type="text/x-json" class="meta-data">
  {
   id: 3
  }
 <-script->
 <a>Click me to get ID</a>
</li>


HTML kodas, su jQuery AJAX, kuriame iškviesime aukščiau esantį JSON kodą:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <title>jQuery And Script Tags With AJAX Data</title>
 <script type="text/javascript" src="jquery-1.3.2.js"><-script->
 <script type="text/javascript">
 
  // I am a jquery plugin that looks for script tags of class
  // meta-data and applies the JSON to its parent element in
  // the metaData key.
  jQuery.fn.applyMetaData = function(){
   // Find all the embedded script meta-data tags and
   // iterate of them to individually apply them to the
   // direct parent node.
   this.find( "script.meta-data" ).each(
    function( nodeIndex, scriptTag ){
     var script = $( this );
     var parent = script.parent();
     var metaData = {};
 
     // Try to evaluate the JSON meta data.
     try {
      metaData = eval( "(" + script.html() + ")" );
     } catch ( error ){
      // JSON was not valid.
     }
 
     // Store meta data into parent.
     parent.data(
      "metaData",
      jQuery.extend(
       {},
       parent.data( "metaData" ),
       metaData
       )
      );
    }
    )
 
    // Once the script tags have been processed,
    // remove them from the DOM.
    .remove()
   ;
 
   // Return the collection without the script tags.
   return( this.not( "script.meta-data" ) );
  }
 
 
  // I handle the html data response from the AJAX request.
  function populate( htmlData ){
   var html = $( htmlData ).applyMetaData();
 
   // Put HTML into DOM.
   $( "#list" )
    .empty()
    .append( html )
   ;
 
   // Bind click handlers.
   $( "#list a" )
    .attr( "href", "javascript:void( 0 )" )
    .click(
     function( clickEvent ){
      // Alert parent ID.
      alert( $( this ).parent().data( "metaData" ).id );
 
      // Prevent default event.
      return( false );
     }
     )
   ;
  }
 
 
  // When DOM loads, initialize.
  $(
   function(){
    // Grab the remote data via AJAX request.
    $.ajax({
     type: "get",
     url: "script3_data.htm",
     dataType: "html",
     success: populate
     });
   }
   );
 
 <-script->
</head>
<body>
 
 <h1>
  jQuery And Script Tags With AJAX Data
 </h1>
 
 <ul id="list" />
 
</body>
</html>


----
DAR VIENAS PAVYZDYS(PHP5+ ir JSON):

<?php
$json 
'{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($jsontrue));

?>


Pagal @ozzWANTED , PhpFusion-Lt.com.
Pradinės straipsnio versijos autorius, NePo @ Pixel.lt