22
JSON Java Script Object Notation Miloš Da vidovi ć 11732

Json

Embed Size (px)

DESCRIPTION

Json

Citation preview

Page 1: Json

JSON

Java Script Object Notation

Miloš Davidović 11732

Page 2: Json

1

Sadržaj Uvod..........................................................................................................................................21. JSON gramatika.....................................................................................................................32. JSON i XML............................................................................................................................73. JSON u Ajaxu.......................................................................................................................204. Sigurnost.............................................................................................................................205. Literatura............................................................................................................................21

Page 3: Json

2

Uvod

JSON (JavaScript Object Notation) je jedan od lakših tekstualnih otvorenih standardadizajniran za čitljivu razmenu podataka. Lak je i za čitanje i pisanje, kao i za generisanje i analiziranje. Izveden je iz JavaScript jezika za predstavljanje jednostavnih struktura podataka i asocijativnih nizova, odnosno objekata.

JSON je prvi put korišćen u State Software kompaniji koju je osnovao Douglas Crockford koji je takođe i izumeo JSON. Web sajt JSON.org, je počeo sa radom 2002. godine, zatim decembra 2005. Yahoo počijne sa upotrebom JSON-a na neke od svojih web servisa. Google počinje sa upotrebom JSON-a za svoje GData web protokole decembra 2006.

Koncept JSON-a je jednostavan: prosleđuje podatke do klijenta kao string i onda korišćenjem JavaScript funkcije eval() konvertuje taj string u nizove i objekte. JSON je "lightweight", otvoreni format za razmenu tekstualno baziranih podataka koji je pogodan za upotrebu u web aplikacijama koje koriste Ajax. JSON je tekstualni format koji je kompletno nezavisan jezik ali sa parserima za mnoge jezike što ga čini idelanim jezikom za prenos podataka.

Njegova ekstenzija je .json. JSON format je često korišćen za serijalizaciju i prenos struktuiranih podataka preko mrežne veze, prvenstveno izmedju servera i web aplikaicja, služeći kao alternativa za XML. Sastavljen je od samo dve strukture: Key-Value kolekcije i Niza. Key-Value kolekcija je nešto slično dvodimenzionalnom nizu. Ekvivalent je Dictionary<> u C#. Tipovi podataka koji se mogu smestiti u ove kolekcije su: Object, String, Number, Array, True/False i Null.

Page 4: Json

3

1. JSON gramatika

JSON tekst se sastoji od sekvence tokena. Set tokena uključuje set strukturnih karaktera, stringove, brojeve, false, true i null. JSON tekst je serijalizovan objekat ili niz.JavaScript Object Notation je tekst format za serijalizaciju struktuiranih podataka. Izveden je iz objekta literala JavaScript-a, kao sto je definisano u ECMAScript Programming Language.

String je kolekcija nula ili više unicode karaktera oivičenih duplim navodnicima. Karakter je predstavljen kao jedinstven karakter. String je predstavljen kao u C-u, tj. Javi.

Slika 1 String u JSON-u

Niz je uređena kolekcija vrednosti oivičena srednjim zagradama, a vrednosti su razdvojene znakom zareza.

Slika 3 Definicija JSON niza

Page 5: Json

4

Brojevi su slični kao i u mnogim programskim jezicima, dozvoljeno je stavljanje „-” ili E za eksponent (može biti i malo e). Oktalni i heksadekadni brojevi nisu dozvoljeni kao i postavljanje 0 na prvom mestu. Decimale su dozvoljene.

Slika 41 Definicija vrednosti u JSON-u

Broj je sličan kao broj u C-u ili Javi, osim što se ne koriste oktalni ni heksadecimalni formati.

Slika 5 Broj u JSON-u

Objekat je neuređena kolekcija nula ili više imena/promenljivih, gde je ime tipa string, a vrednosti može biti string, bollean, null, objekat ili niz. Niz je uredjena sekvenca nula ili nekih drugih vrednosti. Termini „objekat” i „niz” potiču iz JavaScripta. Cilj JSON-a je da bude minimalan, portabilan, tekstualan i podskup JavaScript-a.Iza svakog imena sledi dvotačka i ime/vrednost par odvojen zarezom:

Page 6: Json

5

Slika 2 Definicija JSON objekta

Primeri objekata:

{}{ članovi }

Ograničenja: false, null, true, object, array, number i string moraju biti malim slovima ispisani. Struktura objekta mora biti ograničena {}; imena objekata treba da budu jedinstvena.

Primer 1. - Predstavljanje objekta preko JSON-a: Objekat ima string polja za ime i prezime, polje za godine, i sadrži i objekat koji ima adresu i broj telefona.

{ "firstName": "John", "lastName" : "Smith", "age" : 25, "address" : { "streetAddress": "21 2nd Street", "city" : "New York", "state" : "NY", "postalCode" : "10021" }, "phoneNumber": [ { "type" : "home", "number": "212 555-1234" }, { "type" : "fax", "number": "646 555-4567" } ]}

Pošto je JSON podset JavaScript-a, moguće je parsiranje JSON teksta u objekat, koristeći JavaScript funkciju eval(). Npr. ako gore navedeni podatak sadrži JavaScript string promenljivu contact, moguće je kreirati JavaScript objekat p:var p = eval("(" + contact + ")");

Page 7: Json

6

Promenljiva contact mora biti oivičena zagradama da bi se izbegla dvosmislenost u JavaScript sintaksi. Preporučljiv način je da se koristi JSON parser. Ukoliko nismo sigurni u ispravnost teksta, da se on neće shvatiti dvosmisleno, treba izbegavati funkciju eval(). Ispravno implementiran JSON parser ce prihvatiti samo ispravan JSON, sprečavajući na taj način izvršenje loših i neispravnih programa. Današnji browseri kao sto su Firefox, Chrome, IE8 sadrže specijalne karakteristike za parsovanje JSON-a. Brovserska podrška je efikasnija i sigurnija za upotrebu, za razliku od eval() funkcije.

Neusaglašenost: JavaScript sintaksa sadrži nekoliko osnovnih tipova podataka koji nisu uključeni u JSON standardu. To su date, error, math, regularni izrazi i funkcije. Da bi se koristili u JSON-u, moraju se predstaviti u nekom drugom formatu podataka. Od 2011.godine postoji nekoliko standarda za konvertovanje izmedju datuma i stringova, ali ni jedan nije univerzalan. Drugi jezici mogu imati različite skupove osnovnih tipova koji moraju biti pažljivo serijalizovani da bi se bavili ovom vrstom konverzije.Šema: Postoji nekoliko načina da se proveri struktura i tipovi podataka u JSON objektu, slično kao kod XML-a. JSON šema mora se ručno napraviti, za razliku od XML-a koji se može generisati automatski. Za sada još uvek ne postoje alati za generisanje JSON šeme od JSON podataka. JSON šema treba da obezbedi validnost, dokumentaciju i kontrolu interakcije JSON podataka. Koncept JSON šeme se zasniva na XML šemi, RelaxNG i Kwalify. Primer 2.{ "name":"Product", "properties": { "id": { "type":"number", "description":"Product identifier", "required":true }, "name": { "type":"string", "description":"Name of the product", "required":true }, "price": { "type":"number", "minimum":0, "required":true }, "tags": { "type":"array", "items": { "type":"string" }

Page 8: Json

7

}, "stock": { "type":"object", "properties": { "warehouse": { "type":"number" }, "retail": { "type":"number" } } } }}JSON šema moze testirati validnost sledećeg koda:{ "id": 1, "name": "Foo", "price": 123, "tags": ["Bar","Eek"], "stock": { "warehouse":300, "retail":20 }}

2. JSON i XML

JSON i XML se mogu koristiti za predstavljanje objekata iz memorije i to u tekstualnom formatu koji je čitljiv od strane ljudi. Štaviše, ova dva formata za razmenu su izomorfna – za dati tekst u jednom formatu postoji ekvivalentan u drugom. Prilikom odlučivanja koji format će se koristiti nije jednostavno napraviti izbor. XML ima korene u označavanju tekstova dokumenta i dobar je na tom polju, dok je JSON s druge strane s korenima u programerskim jezicima i strukturama koje usled toga pružaju prirodnije i dostupnije preslikavanje struktuiranim podacima za razmenu. Uporedni prikaz JSON i XML data je u sledećoj tabeli:

Page 9: Json

8

Tabela 1: Uporedni prikaz XML-a i JSON-a

Karakteristika XML JSONTipovi podataka Nema pojam tipa podataka.

Tipovi podataka se mogu dodati kroz XML šemu.

Pruža skalarne tipove podataka i mogućnost izražavanja struktuiranih podataka kroz nizove i objekte.

Podrška nizovima Podrška nizovima je moguća ali komplikovana

Ima podršku za nizove

Podrška objektima Objekti moraju biti izraženi konvencijama često korišćenjem atributa i elemenata

Ima podršku za objekte

Podrška null vrednosti Zahteva korišćenje xsi:null na elementima u XML instanci dokumenta plus importovanje odgovarajucheg namespace-a

Prirodno prepoznaje nullvrednosti

Komentari Ima podršku i obično je dostupna kroz API

Nisu podržani

Namespaces Podržava čim se eliminiše rizik kolizije imena prilikom kombinacije dokumenata. Takođe omogućuju postojećim standardnim XML-ovima da budu proširivi.

Ne postoji koncept namespace-a. Kolizije oko imenovanja se obično izbegavaju ugnježdavanjem objekata ili korišćenjem prefiska.

Odluke formatiranja Kompleksno. Zahteva veliki napor da se odluči kako se preslikavaju tipovi aplikacije u XML elemente i atribute. Postoje debate o tome koji je pristup bolji da li onaj koji se zasniva na elementima ili na atributima o čemu je već bilo reči.

Jednostavno. Pruža direktnije mapiranje za podatke aplikacije. Jedini nedostatak je odsustvo tipa datuma.

Veličina Dokumenti su dugački naročito ako se koristi pristup zasnovan na elemetima

Sintaksa je veoma elegantna i to vodi formatiranom tekstu gde je najveći deo prostora iskorišćen za prezentaciju podataka.

Parsiranje u JavaScript-u Zahteva XML DOM implementaciju i dodatan kod za mapiranje teksta ponovo u JavaScript objekte

Ne zahteva dodatan kod za parsiranje, koristi se JavaScript-ova eval() funkcija

Brzina učenja Zahteva korišćenje nekoliko tehnologija: Xpath, XML Schema, XSLT, XML Namespaces, DOM itd.

Veoma jednostavna tehnologija koja je poznata programerima koji imaju znanje JavaScripta ili nekog programskog jezika.

Page 10: Json

9

Primer 3.{"glossary": {"title": "example glossary",

"GlossDiv": { "title": "S","GlossList": {

"GlossEntry": {

"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup

Language","Acronym": "SGML","Abbrev": "ISO 8879:1986",

"GlossDef": {

"para": "A meta-markup language, used to create markup languages such as DocBook.",

"GlossSeeAlso": ["GML", "XML"]},

"GlossSee": "markup" } } }}}

Isti tekst predstavljen preko XML-a:

<!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook V3.1//EN"><glossary><title>example glossary</title> <GlossDiv><title>S</title> <GlossList> <GlossEntry ID="SGML" SortAs="SGML"> <GlossTerm>Standard Generalized Markup Language</GlossTerm> <Acronym>SGML</Acronym> <Abbrev>ISO 8879:1986</Abbrev> <GlossDef> <para>A meta-markup language, used to create markuplanguages such as DocBook.</para> <GlossSeeAlso OtherTerm="GML"> <GlossSeeAlso OtherTerm="XML"> </GlossDef> <GlossSee OtherTerm="markup"> </GlossEntry> </GlossList>

Page 11: Json

10

</GlossDiv></glossary>

Primer 4.{"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] }}}

Isti tekst predstavljen preko XML-a:

<menu id="file" value="File"> <popup> <menuitem value="New" onclick="CreateNewDoc()" /> <menuitem value="Open" onclick="OpenDoc()" /> <menuitem value="Close" onclick="CloseDoc()" /> </popup></menu>Primer 5.{"widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" }}}

Isti tekst predstavljen preko XML-a:

Page 12: Json

11

<widget> <debug>on</debug> <window title="Sample Konfabulator Widget"> <name>main_window</name> <width>500</width> <height>500</height> </window> <image src="Images/Sun.png" name="sun1"> <hOffset>250</hOffset> <vOffset>250</vOffset> <alignment>center</alignment> </image> <text data="Click Here" size="36" style="bold"> <name>text1</name> <hOffset>250</hOffset> <vOffset>100</vOffset> <alignment>center</alignment> <onMouseUp> sun1.opacity = (sun1.opacity / 100) * 90; </onMouseUp> </text></widget>Primer 6.{"web-app": { "servlet": [ { "servlet-name": "cofaxCDS", "servlet-class": "org.cofax.cds.CDSServlet", "init-param": { "configGlossary:installationAt": "Philadelphia, PA", "configGlossary:adminEmail": "[email protected]", "configGlossary:poweredBy": "Cofax", "configGlossary:poweredByIcon": "/images/cofax.gif", "configGlossary:staticPath": "/content/static", "templateProcessorClass": "org.cofax.WysiwygTemplate", "templateLoaderClass": "org.cofax.FilesTemplateLoader", "templatePath": "templates", "templateOverridePath": "", "defaultListTemplate": "listTemplate.htm", "defaultFileTemplate": "articleTemplate.htm", "useJSP": false, "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm",

Page 13: Json

12

"searchEngineRobotsDb": "WEB-INF/robots.db", "useDataStore": true, "dataStoreClass": "org.cofax.SqlDataStore", "redirectionClass": "org.cofax.SqlRedirection", "dataStoreName": "cofax", "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser": "sa", "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreInitConns": 10, "dataStoreMaxConns": 100, "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", "maxUrlLength": 500}}, { "servlet-name": "cofaxEmail", "servlet-class": "org.cofax.cds.EmailServlet", "init-param": { "mailHost": "mail1", "mailHostOverride": "mail2"}}, { "servlet-name": "cofaxAdmin", "servlet-class": "org.cofax.cds.AdminServlet"},

{ "servlet-name": "fileServlet", "servlet-class": "org.cofax.cds.FileServlet"}, { "servlet-name": "cofaxTools", "servlet-class": "org.cofax.cms.CofaxToolsServlet", "init-param": { "templatePath": "toolstemplates/", "log": 1, "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize": "", "dataLog": 1, "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize": "", "removePageCache": "/content/admin/remove?cache=pages&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", "lookInContext": 1, "adminGroupID": 4, "betaServer": true}}], "servlet-mapping": { "cofaxCDS": "/", "cofaxEmail": "/cofaxutil/aemail/*", "cofaxAdmin": "/admin/*", "fileServlet": "/static/*", "cofaxTools": "/tools/*"},

Page 14: Json

13

"taglib": { "taglib-uri": "cofax.tld", "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}

Isti fajl predstavljen preko XML-a:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"><web-app> <servlet> <servlet-name> cofaxCDS </servlet-name> <servlet-class> org.cofax.cds.CDSServlet </servlet-class>

<init-param> <param-name>configGlossary:installationAt</param-name> <param-value>Philadelphia, PA</param-value> </init-param> <init-param> <param-name>configGlossary:adminEmail</param-name> <param-value>[email protected]</param-value> </init-param> <init-param> <param-name>configGlossary:poweredBy</param-name> <param-value>Cofax</param-value> </init-param> <init-param> <param-name>configGlossary:poweredByIcon</param-name> <param-value>/images/cofax.gif</param-value> </init-param> <init-param> <param-name>configGlossary:staticPath</param-name> <param-value>/content/static</param-value> </init-param>

<init-param> <param-name>templateProcessorClass</param-name> <param-value>org.cofax.WysiwygTemplate</param-value> </init-param>

<init-param> <param-name>templateLoaderClass</param-name> <param-value>org.cofax.FilesTemplateLoader</param-value> </init-param>

<init-param> <param-name>templatePath</param-name> <param-value>templates</param-value>

Page 15: Json

14

</init-param>

<init-param> <param-name>templateOverridePath</param-name> <param-value></param-value> </init-param>

<init-param> <param-name>defaultListTemplate</param-name> <param-value>listTemplate.htm</param-value> </init-param>

<init-param> <param-name>defaultFileTemplate</param-name> <param-value>articleTemplate.htm</param-value> </init-param>

<init-param> <param-name>useJSP</param-name> <param-value>false</param-value> </init-param>

<init-param> <param-name>jspListTemplate</param-name> <param-value>listTemplate.jsp</param-value> </init-param>

<init-param> <param-name>jspFileTemplate</param-name> <param-value>articleTemplate.jsp</param-value> </init-param>

<init-param> <param-name>cachePackageTagsTrack</param-name> <param-value>200</param-value> </init-param>

<init-param> <param-name>cachePackageTagsStore</param-name> <param-value>200</param-value> </init-param>

<init-param> <param-name>cachePackageTagsRefresh</param-name> <param-value>60</param-value> </init-param>

<init-param> <param-name>cacheTemplatesTrack</param-name> <param-value>100</param-value> </init-param>

<init-param> <param-name>cacheTemplatesStore</param-name> <param-value>50</param-value> </init-param>

Page 16: Json

15

<init-param> <param-name>cacheTemplatesRefresh</param-name> <param-value>15</param-value> </init-param>

<init-param> <param-name>cachePagesTrack</param-name> <param-value>200</param-value> </init-param>

<init-param> <param-name>cachePagesStore</param-name> <param-value>100</param-value> </init-param>

<init-param> <param-name>cachePagesRefresh</param-name> <param-value>10</param-value> </init-param>

<init-param> <param-name>cachePagesDirtyRead</param-name> <param-value>10</param-value> </init-param>

<init-param> <param-name>searchEngineListTemplate</param-name> <param-value>forSearchEnginesList.htm</param-value> </init-param>

<init-param> <param-name>searchEngineFileTemplate</param-name> <param-value>forSearchEngines.htm</param-value> </init-param>

<init-param> <param-name>searchEngineRobotsDb</param-name> <param-value>WEB-INF/robots.db</param-value> </init-param>

<init-param> <param-name>useDataStore</param-name> <param-value>true</param-value> </init-param>

<init-param> <param-name>dataStoreClass</param-name> <param-value>org.cofax.SqlDataStore</param-value> </init-param>

<init-param> <param-name>redirectionClass</param-name> <param-value>org.cofax.SqlRedirection</param-value> </init-param> <init-param>

Page 17: Json

16

<param-name>dataStoreName</param-name> <param-value>cofax</param-value> </init-param>

<init-param> <param-name>dataStoreDriver</param-name> <param-value>com.microsoft.jdbc.sqlserver.SQLServerDriver</param-value> </init-param>

<init-param> <param-name>dataStoreUrl</param-name> <param-value>jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon</param-value> </init-param>

<init-param> <param-name>dataStoreUser</param-name> <param-value>sa</param-value> </init-param>

<init-param> <param-name>dataStorePassword</param-name> <param-value></param-value> </init-param>

<init-param> <param-name>dataStoreTestQuery</param-name> <param-value>SET NOCOUNT ON;select test='test';</param-value> </init-param>

<init-param> <param-name>dataStoreLogFile</param-name> <param-value>/usr/local/tomcat/logs/datastore.log</param-value> </init-param>

<init-param> <param-name>dataStoreInitConns</param-name> <param-value>10</param-value> </init-param>

<init-param> <param-name>dataStoreMaxConns</param-name> <param-value>100</param-value> </init-param>

<init-param> <param-name>dataStoreConnUsageLimit</param-name> <param-value>100</param-value> </init-param><init-param>

<param-name>dataStoreLogLevel</param-name> <param-value>debug</param-value> </init-param>

Page 18: Json

17

<init-param> <param-name>maxUrlLength</param-name> <param-value>500</param-value> </init-param>

</servlet>

<servlet> <servlet-name> cofaxEmail </servlet-name> <servlet-class> org.cofax.cds.EmailServlet </servlet-class>

<init-param> <param-name>mailHost</param-name> <param-value>mail1</param-value> </init-param>

<init-param> <param-name>mailHostOverride</param-name> <param-value>mail2</param-value> </init-param> </servlet>

<servlet> <servlet-name> cofaxAdmin </servlet-name> <servlet-class> org.cofax.cds.AdminServlet </servlet-class> </servlet>

<servlet> <servlet-name> fileServlet </servlet-name> <servlet-class> org.cofax.cds.FileServlet </servlet-class> </servlet>

<servlet> <servlet-name> cofaxTools </servlet-name> <servlet-class> org.cofax.cms.CofaxToolsServlet </servlet-class>

<init-param> <param-name>templatePath</param-name> <param-value>toolstemplates/</param-value>

Page 19: Json

18

</init-param>

<init-param> <param-name>log</param-name> <param-value>1</param-value> </init-param>

<init-param> <param-name>logLocation</param-name> <param-value>/usr/local/tomcat/logs/CofaxTools.log</param-value> </init-param>

<init-param> <param-name>logMaxSize</param-name> <param-value></param-value> </init-param>

<init-param> <param-name>dataLog</param-name> <param-value>1</param-value> </init-param>

<init-param> <param-name>dataLogLocation</param-name> <param-value>/usr/local/tomcat/logs/dataLog.log</param-value> </init-param>

<init-param> <param-name>dataLogMaxSize</param-name> <param-value></param-value> </init-param>

<init-param> <param-name>removePageCache</param-name> <param-value>/content/admin/remove?cache=pages&id=</param-value> </init-param>

<init-param> <param-name>removeTemplateCache</param-name> <param-value>/content/admin/remove?cache=templates&id=</param-value> </init-param>

<init-param> <param-name>fileTransferFolder</param-name> <param-value>/usr/local/tomcat/webapps/content/fileTransferFolder</param-value> </init-param>

<init-param> <param-name>lookInContext</param-name> <param-value>1</param-value>

Page 20: Json

19

</init-param>

<init-param> <param-name>adminGroupID</param-name> <param-value>4</param-value> </init-param>

<init-param> <param-name>betaServer</param-name> <param-value>true</param-value> </init-param>

</servlet>

<servlet-mapping> <servlet-name> cofaxCDS </servlet-name> <url-pattern> / </url-pattern> </servlet-mapping>

<servlet-mapping> <servlet-name> cofaxEmail </servlet-name> <url-pattern> /cofaxutil/aemail/* </url-pattern> </servlet-mapping>

<servlet-mapping> <servlet-name> cofaxAdmin </servlet-name> <url-pattern> /admin/* </url-pattern> </servlet-mapping>

<servlet-mapping> <servlet-name> fileServlet </servlet-name> <url-pattern> /static/* </url-pattern> </servlet-mapping>

<servlet-mapping> <servlet-name> cofaxTools </servlet-name> <url-pattern> /tools/*

Page 21: Json

20

</url-pattern> </servlet-mapping>

<taglib> <taglib-uri>cofax.tld</taglib-uri> <taglib-location>/WEB-INF/tlds/cofax.tld</taglib-location> </taglib>

</web-app>

3. JSON u Ajax-u

JSON se često koristi u Ajax tehnici. Sledeći kod prikazuje kako klijent može koristiti XMLHttpRequest da zatraži objekat u JSON-formatu od servera.

var my_JSON_object = {};var http_request = new XMLHttpRequest();http_request.open("GET", url, true);http_request.onreadystatechange = function () { var done = 4, ok = 200; if (http_request.readyState == done && http_request.status== ok) { my_JSON_object = JSON.parse(http_request.responseText); }};http_request.send(null);

U ovom primeru vidimo da XMLHttpRequest dozvoljava sintaksne varijacije za IE, Operu, Safari i Mozzila browsere. URL odgovor na zahtev mora biti u istom DNS domenu kao server koji hostuje stranicu koja sadrži zahtev. Alternativno JSONP (JSONP-obrazac koji omogćava stranici da zahteva podatke od server u različitim domenima) prilaz uključuje korišćenje kodirane povratne funkcije prosledjene izmedju klijenta i servera kako bi dozvolila klijentu da učita šifrovan-JSON podatak sa treće strane domena i da obavesti pozivaoca funkcije nakon izvršenja, mada ovo nameće neke bezbednosne rizike i dodatne zahteve na server.Dinamički <script> tagovi mogu takodje da se koriste za prenos JSON podataka, ali je ova tehnika nesigurna, pa je zbog toga predložen JSONRequest kao sigurnije rešenje.

4. Sigurnost

Generalno, kaka je reč o script jezicima, postoje problemi sa sigurnošću. Posto je JSON dizajniran kao podskup JavaScripta, nasledio je i neke njegove nedostatke. Ovi nedostaci se odnose na dinamičko izvršenje JSON-a kao JavaScript-a izlažući tako program “lutajućim ili zlim skriptama”, koje mogu biti pogubne za program, posebno prilikom prenosa podataka sa interneta. Rešenje ovog problema je korišćenje eval() funkcije. Takođe je razvijena i nova funkcija parseJSON() i predstavlja alternativu eval() funkciji i procesira JSON podatke ali ne i JavaScript.

Page 22: Json

21

Literatura1. http://www.json.org/2. http://www.json.org/js.html3. http://json.org/example.html4. http://en.wikipedia.org/wiki/JSON5. http://php.net/manual/en/book.json.php6. http://search.cpan.org/~makamaka/JSON-2.53/lib/JSON.pm7. http://www.json-p.org/8. http://www.w3schools.com/json/default.asp9. http://www.flickr.com/services/api/response.json.html