JSON
JSON (англ. JavaScript Object Notation, укр. об'єктний запис JavaScript, вимовляється джейсон) — це легкий формат обміну даними між комп'ютерами. JSON базується на тексті, і може бути з легкістю прочитаним людиною. Формат дозволяє описувати об'єкти та інші структури даних. Цей формат головним чином використовується для передачі структурованої інформації через мережу (завдяки процесу, що називають серіалізацією).
Розробив і популяризував формат Дуглас Крокфорд (en:Douglas Crockford).
JSON знайшов своє головне призначення у написанні веб-програм, а саме при використанні технології Ajax. JSON виступає як заміна XML під час асинхронної передачі структурованої інформації між клієнтом та сервером. При цьому перевагою JSON перед XML є те, що він дозволяє складні структури в атрибутах, займає менше місця і прямо інтерпретується за допомогою JavaScript в об'єкти.
Зміст |
Використання[ред.]
За рахунок своєї лаконічності в порівнянні з XML, формат JSON може бути більш підходящим для серіалізації складних структур.
Якщо говорити про веб-застосунки, в такому ключі він доречний в задачах обміну даними як між браузером і сервером (AJAX), так і між самими серверами (програмні HTTP-інтерфейси). Формат JSON так само добре підходить для зберігання складних динамічних структур в реляційних базах даних або файловому кеші.
Приклад використання JSON[ред.]
var ajaxData = '{"name": "wiki", "fname": "pedia", "rates": [1, 4, 5, 6]}';
var ajaxObj = JSON.parse( ajaxData );
alert (ajaxObj.name + ajaxObj.rates[2]); /* Виведе "wiki5"*/
Синтаксис[ред.]
JSON будується на двох структурах:
- Набір пар ім'я/значення. У різних мовах це реалізовано як об'єкт, запис, структура, словник, хеш-таблиця, список з ключем або асоціативним масивом.
- Впорядкований список значень. У багатьох мовах це реалізовано як масив, вектор, список, або послідовність.
Це універсальні структури даних. Теоретично всі сучасні мови програмування підтримують їх у тій чи іншій формі. Оскільки JSON використовується для обміну даними між різними мовами програмування, то є сенс будувати його на цих структурах.
У JSON використовуються такі їхні форми:
- Об'єкт — це невпорядкована множина пар ім'я/значення. Об'єкт починається з символу { і закінчується символом }. Кожне значення слідує за : і пари ім'я/значення відділяються комами.
- Масив — це впорядкована множина значень. Масив починається символом [ і закінчується символом ]. Значення відділяються комами.
- Значення може бути рядком в подвійних лапках, або числом, або логічними true чи false, або null, або об'єктом, або масивом. Ці структури можуть бути вкладені одна в одну.
- Рядок — це впорядкована множина з нуля або більше символів юнікода, обмежена подвійними лапками, з використанням escape-послідовностей, що починаються із зворотної косої риски (backslash). Символи представляються простим рядком.
Тип Рядок (String) дуже схожий на String в мовах C і Java. Число теж дуже схоже на C- або Java-число, за винятком того, що вісімкові та шістнадцяткові формати не використовуються. Пропуски можуть бути вставлені між будь-якими двома лексемами.
Наступний приклад показує JSON представлення об'єкта, що описує людину. У об'єкті є рядкові поля імені і прізвища, об'єкт, що описує адресу, і масив, що містить список телефонів.
{ "firstName": "Іван", "lastName": "Коваленко", "address": { "streetAddress": "вул. Грушевського 14, кв.101", "city": "Київ", "postalCode": 21000 }, "phoneNumbers": [ "044 123-1234", "050 123-4567" ] }
Використання JSON в AJAX[ред.]
Наступний фрагмент коду JavaScript показує, як клієнт може використати XMLHttpRequest для запиту об'єктів в форматі JSON з серверу. (Серверна частина коду пропущена, вона просто повертає на запит URL рядок у JSON форматі).
var the_object; var http_request = new XMLHttpRequest(); http_request.open( "GET", url, true ); http_request.send(null); http_request.onreadystatechange = function () { if ( http_request.readyState == 4 ) { if ( http_request.status == 200 ) { the_object = JSON.parse(http_request.responseText); } else { alert( "There was a problem with the URL." ); } http_request = null; } };
Треба відзначити, що тут використання XMLHttpRequest не є кросс-браузерним (за деталями звертайтеся на сторінку XMLHttpRequest), і код зазнаватиме незначних модифкацій в різних версіях оглядачів Internet Explorer, Opera, Safari або Mozilla. Використання запиту XMLHttpRequest обмежено правилом одного джерела (same origin policy): URL, що відповідає на запит, має посилатися на той же сайт, що обслуговує сторінку, що ініціювала запит.
Оглядачі можуть також використовувати тег <iframe> для асинхронного запиту JSON-даних в кросс-браузерному варіанті, або використати просте перенаправлення <form action="url_to_cgi_script" target="name_of_hidden_iframe">. Такий підхід був поширений до приходу популярного нині запиту XMLHttpRequest.
Динамічний тег <script> також можна використати для підвантаження JSON-даних. Ця техніка можлива, щоб обійти надто суворе правило одного джерела, але вона не є безпечною. Запит JSONRequest пропонується, як безпечніша альтернатива.
Питання безпеки[ред.]
Хоча JSON призначений для передачі даних в серіалізованому вигляді, його синтаксис відповідає синтаксису JavaScript і це створює низку проблем безпеки. Часто для обробки даних, отриманих від зовнішнього джерела у форматі JSON, до них застосовується функція eval() без якої-небудь попередньої перевірки.
JavaScript eval()[ред.]
Оскільки JSON представляється синтаксично правильним фрагментом коду JavaScript, природним способом розбору JSON-даних в JavaScript-програмі є використання вбудованої в JavaScript функції eval(), яка призначена для обчислення JavaScript-виразів. При цьому підході відпадає необхідність у використанні додаткових парсерів.
Техніка використання eval() робить систему вразливою, якщо джерело JSON-даних, що використовуються, не відноситься до надійних. В якості таких даних може виступати шкідливий JavaScript код для атак за допомогою ін'єкції коду. За допомогою цієї вразливості можливо здійснювати крадіжку даних, підробку автентифікації. Проте, вразливість можна усунути за рахунок використання додаткових засобів перевірки даних на коректність. Наприклад, до виконання eval() отримані від зовнішнього джерела дані можуть перевірятися за допомогою регулярних виразів. У RFC, що визначає JSON[1] пропонується використовувати такий код для перевірки його відповідності формату JSON
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + testedData + ')');
Як безпечніша альтернатива eval() була запропонована нова функція parseJSON(), здатна обробляти тільки JSON-дані. Вона була представлена в четвертій версії стандарту ECMAScript і описана в статті «JSON: Знежирена альтернатива XML».. В наш час[Коли?] вона доступна як бібліотека JavaScript http://www.JSON.org/json2.js і буде включена в п'яту редакцію ECMAScript.
Вбудований JSON[ред.]
Останні версії веб-браузерів мають вбудовану підтримку JSON і здатні його обробляти без виклику функції eval(), що приводить до описаної проблеми. Обробка JSON у такому разі зазвичай здійснюється швидше. Так в червні 2009 року такі браузери мали вбудовану підтримку JSON:
- Mozilla Firefox 3.5+, SeaMonkey 2, та Thunderbird 3[2]
- Microsoft Internet Explorer 8«Native JSON in IE8». (англ.)
- Браузери, засновані на WebKit (наприклад, Google Chrome, Apple Safari)[3]
Принаймні, дві популярні бібліотеки JavaScript використовують вбудований JSON у разі його доступності:
Підробка крос-доменного запиту[ред.]
Непродумане використання JSON робить сайти вразливими до підробки міжсайтових запитів (CSRF або XSRF)[6]. Оскільки тег <script> допускає використання джерела, що не належить до того ж домену, що і використовуваний ресурс, це дозволяє виконувати код даних, представлених у форматі JSON, в контексті довільної сторінки, що робить можливою компрометацію паролів або іншої конфіденційної інформації користувачів, що пройшли авторизацію на іншому сайті.
Це є проблемою тільки у разі вмісту в JSON-даних конфіденційної інформації, яка може бути компрометована третьою стороною і якщо сервер розраховує на політику одного джерела, блокуючи доступ до даних при виявленні зовнішнього запиту. Це не є проблемою, якщо сервер визначає допустимість запиту, надаючи дані тільки у разі його коректності. HTTP cookie не можна використовувати для визначення цього. Виключне використання HTTP cookie використовується підробкою міжсайтових запитів.
Розширення[ред.]
JSONP[ред.]
JSONP або «JSON з підкладкою» є розширенням JSON, коли ім'я функції зворотного виклику вказується як вхідний аргумент. Спочатку ідея була запропонована в блозі MacPython в 2005 році [7], і в наш час[Коли?] використовується багатьма Web 2.0 застосунками, такими, як Dojo Toolkit Applications, Google Toolkit Applications [8] і zanox Web Services. Подальші розширення цього протоколу були запропоновані з урахуванням введення додаткових аргументів, як, наприклад, у разі JSONPP [9] за підтримки S3DB вебсервісів.
Оскільки JSONP використовує скрипт-теги, виклики по суті відкриті світу. З цієї причини, JSONP може бути недоречними для зберігання конфіденційних даних[10].
Включення скриптових тегів від віддалених сайтів дозволяє їм передати будь-який контент на сайті. Якщо віддалений сайт має вразливості, які дозволяють виконати Javascript ін'єкції, то початковий сайт також може бути зачеплений ними.
BSON[ред.]
BSON — це бінарна форма представлення простих структур даних і асоціативних масивів (які називають об'єктами або документами). Ім'я "BSON" засноване на визначенні JSON і неофіційно означає "Binary JSON" (бінарний JSON).
Об'єкт посилання[ред.]
Стандарт JSON не підтримує посилання об'єкта, але Dojo Toolkit ілюструє, як конвенції можуть бути прийняті для подання підтримки таких посилань за допомогою стандартів JSON. Зокрема, dojox.json.ref модуль забезпечує підтримку декількох форм, включаючи кругові посилання, множинні посилання, посилання всередині повідомлень, і ледачі посилання.[11]
Порівняння з YAML[ред.]
Як функціонально, так і синтаксично JSON є підмножиною мови YAML. Зокрема, специфікація YAML 1.2 указує, що «будь-який файл у форматі JSON є коректним файлом у форматі YAML»[12]. Найпоширеніший парсер YAML здатний обробляти і JSON.[13] Специфікація YAML до версії 1.2 не повністю покривала JSON, в першу чергу через відсутність рідної підтримки UTF-32 в YAML, а також вимоги пропуску після роздільника-коми. Крім того, специфікація JSON включала коментарі в стилі /* */.
Найважливішою відмінністю YAML є набір розширень синтаксису, яким немає аналогів в JSON:
- Реляційний
- YAML підтримує реляційні дані: у YAML-документі можна посилатися на якір, що зустрівся раніше у файлі/потоці. Таким чином можна виразити рекурсивні структури.
- Розширюваний
- YAML підтримує розширювані типи даних крім примітивів (тобто рядків, чисел, логічних змінних).
- Блоки:
- у YAML доступний блоковий синтаксис з відступами; він дозволяє описати структуровані дані без використання зайвих символів (всіляких дужок, лапок тощо).
JSON Schema[ред.]
JSON Schema — одна з мов опису структури JSON документа. Використовує синтаксис JSON. Базується на концепціях XML Schema, RelaxNG, Kwalify. JSON Schema — самоописова мова: при її використанні для обробки даних і опису їхньої допустимості можуть використовуватися одні і ті ж інструменти серіалізації/десеріалізації.[14]
Джерела[ред.]
Виноски[ред.]
- ↑ RFC 4627
- ↑ «Using native JSON». (англ.)
- ↑ «Implement ES 3.1 JSON object». (англ.)
- ↑ «Ticket #4429». (англ.)
- ↑ «Ticket #8111». (англ.)
- ↑ Advanced Web Attack Techniques using GMail — Джеремі Гроссмен, WhiteHat Security (англ.)
- ↑ «from __future__ import * » Remote JSON — JSONP». Bob.pythonmac.org. Процитовано 2008-09-08.
- ↑ GWT Tutorial: How to Read Web Services Client-Side with JSONP
- ↑ Almeida Jonas JSON, JSONP, JSONPP? (June 11, 2008). Переглянуто: 2009-04-26.
- ↑ RIAspot. «JSON P for Cross Site XHR».
- ↑ «JSON referencing in Dojo».
- ↑ YAML Ver.1.2 Working Draft
- ↑ YAML is JSON, RedHanded, 08 апреля 2005.
- ↑ Json.Com. «JSON Schema Proposal».
Посилання[ред.]
- Сайт json.org
- RFC 4627, поточна формальна специфікація JSON
- Обмеження JSONангл.
- wxJSON — бібліотека для обробки JSON в wxWidgets.
Підручники[ред.]
- AJAX без XMLангл. Порівнюємо використання XML, об'єкти JavaScript і JSON
- Пришвидчення AJAX з JSON Приклади, де JSON простіше за XML.
- Введення до JSON від Daniel Rubio
- JSON/AJAX/PHP Простий курс і бібліотеки кодів
- Прискорення розробки веб-клієнтів на AJAX з JSON та GWT Простий підручник і код для використання JSON з GWT
