JSON: основа використання. Формат JSON: що це таке, як створити та відкрити файл Створення json файлу

💖 Подобається?Поділися з друзями посиланням

JSON (JavaScript Object Notation) – це формат передачі даних. З назви видно, що формат базується на мові програмування JavaScript, але він доступний і в інших мовах (Python, Ruby, PHP, Java).

JSON використовує розширення.json. При використанні його в інших файлових форматах(наприклад, .html) рядок JSON береться в лапки або присвоюється змінним. Цей формат легко передається між веб-сервером та клієнтом або браузером.

Легкий і простий для сприйняття JSON – відмінна альтернатива XML.

Даний посібник ознайомить вас з перевагами, об'єктами, загальною структурою та синтаксисом JSON.

Синтаксис та структура JSON

Об'єкт JSON має вигляд "ключ-значення" і зазвичай записується у фігурних дужках. Під час роботи з JSON усі об'єкти зберігаються у файлі.json, але також можуть існувати як окремі об'єкти в контексті програми.

Об'єкт JSON виглядає так:

"first_name" : "John",
"last_name" : "Smith",
"location" : "London",
"online" : true,
"followers" : 987

Це дуже простий приклад. Об'єкт JSON може містити багато рядків.

Як бачите, об'єкт складається з пар «ключ-значення», які укладені у фігурні дужки. Більшість даних у JSON записується як об'єктів.

Між ключем і значенням ставиться двокрапка. Після кожної пари потрібно поставити кому. В результаті виходить:

"key": "value", "key": "value", "key": "value"

Ключ у JSON знаходиться ліворуч. Ключ потрібно поміщати у подвійні лапки. Як ключ можна використовувати будь-який валідний рядок. В рамках одного об'єкта всі ключі мають бути унікальними. Ключ може містити пробіл (first name), але при програмуванні можуть виникнути проблеми з доступом до такого ключа. Тому замість пропуску краще використовувати підкреслення (first_name).

Значення JSON знаходяться у правій частині стовпця. Як значення можна використовувати будь-який простий тип даних:

  • Рядки
  • Числа
  • Об'єкти
  • Масиви
  • Логічні дані (true чи false)

Значення можуть бути представлені складними типами даних (наприклад, об'єктами або масивами JSON).

JSON підтримує індивідуальний синтаксис кожного з перерахованих вище типів даних: якщо значення представлено рядком, воно буде взято в лапки, а якщо числом, то ні.

Як правило, дані у файлах.json записуються в стовпчик, однак JSON можна записати і в рядок:

( "first_name" : "John", "last_name": "Smith", "online" : true, )

Так зазвичай записуються дані JSON файли іншого типу.

Записуючи дані JSON в стовпець, ви підвищуєте зручність читання файлу (особливо якщо даних у файлі багато). JSON ігнорує прогалини між стовпцями, тому за допомогою них ви можете розділити дані на зручну для сприйняття кількість стовпців.

"first_name" : "John",
"last_name" : "Smith",
"online" : true

Зверніть увагу: об'єкти JSON дуже схожі на об'єкти JavaScriptале це не один і той же формат. Наприклад, JavaScript можна використовувати функції, а JSON не можна.

Головною перевагою JSON є те, що дані в цьому форматі підтримують багато популярних мов програмування, тому їх можна швидко передати.

Тепер ви знайомі з базовим синтаксисом JSON. Але файли JSON можуть мати складну, ієрархічну структуру, що включає вкладені масиви та об'єкти.

Складні типи в JSON

JSON може зберігати вкладені об'єкти та масиви, які будуть передаватися як значення присвоєного їм ключа.

Вкладені об'єкти

Нижче ви знайдете приклад – файл users.json, який містить дані про користувачів. Для кожного користувача

(«John», «Jesse», «Drew», «Jamie») як значення передається вкладений об'єкт, який, у свою чергу, теж складається з ключів і значень.

Примітка: Перший вкладений об'єкт JSON виділено червоним.

"John": (
"username" : " John",
"location" : "London",
"online" : true,
"followers" : 987

"Jesse" : (
"username" : "Jesse",
"location" : "Washington",
"online": false,
"followers" : 432

"drew" : (
"username" : "Drew",
"location" : "Paris",
"online": false,
"followers" : 321

"jamie" : (
"username" : "Jamie",
"location" : "Berlin",
"online" : true,
"followers" : 654

Зверніть увагу: фігурні дужки використовуються і у вкладеному, і в основному об'єкті. Коми у вкладених об'єктах використовуються так само, як і у звичайних.

Вкладені масиви

Дані можна вкладати в JSON за допомогою масивів JavaScript, які передаватимуться як значення. У JavaScript на початку та в кінці масиву використовуються квадратні дужки(). Масив – це впорядкований набір даних, який може містити різні типи даних.

Масив використовують передачі великої кількості даних, які можна згрупувати. Наприклад спробуємо записати дані про користувача.

{
"first_name" : "John",
"last_name" : "Smith",
"location" : "London",
"websites" : [

"description" : "work",
"URL" : "https://www.johnsmithsite.com/"

},
{

"desciption" : "tutorials",
"URL" : "https://www.johnsmithsite.com/tutorials"

"social_media" : [

"description" : "twitter",
"link": "https://twitter.com/johnsmith"

"description" : "facebook",
"link" : "https://www.facebook.com/johnsmith"

"description" : "github",
"link" : "https://github.com/johnsmith"

Ключам «websites» та «social_media» в якості значень присвоєно масиви, які поміщаються у квадратні дужки.

За допомогою вкладених масивів та об'єктів можна створити складну ієрархію даних.

JSON чи XML?

XML (eXtensible Markup Language) дозволяє зберігати дані у зручному для сприйняття людини та машини вигляді. Формат XML підтримується великою кількістю програмних мов.

У XML та JSON дуже багато спільного. Однак XML вимагає набагато більше тексту, отже такі файли об'ємніші і їх складніше читати і писати. Більше того, XML обробляється лише за допомогою інтерпретатора XML, а JSON можна обробити за допомогою простої функції. На відміну від JSON, XML не може зберігати масиви.

Порівняємо два файли: вони містять однакові дані, але перший написаний у форматі XML, а другий в JSON.

users.xml

John London

Jesse Washington

Drew Paris

Jamie Berlin

users.json
("users": [

("username" : "John", "location" : "London"),
("username" : "Jesse", "location" : "Washington"),
("username" : "Drew", "location" : "Paris"),
("username" : "JamieMantisShrimp", "location" : "Berlin")

JSON – дуже компактний формат і не вимагає такої кількості тегів, як XML. Крім того, XML на відміну від JSON не підтримує масиви.

Якщо ви знайомі з HTML, ви помітили, що формат XMLдуже схожий на нього (зокрема тегами). JSON простіше, вимагає менше тексту та його простіше використовувати, наприклад, у програмах AJAX.

Звичайно, формат потрібно вибирати в залежності від потреб програми.

Інструменти для JSON

JSON зазвичай використовується в JavaScript, але цей формат широко застосовується в інших мовах програмування.

Більше інформації про сумісність та обробку JSON можна знайти на сайті проекту та в бібліотеці jQuery.

Писати JSON із нуля доводиться рідко. Зазвичай дані завантажуються з вихідних кодів або перетворюються на JSON. Ви можете перетворити CSV або дані з роздільниками табуляцією на JSON за допомогою відкритого інструменту Mr. Data Converter. Щоб перетворити XML на JSON і навпаки, використовуйте utilities-online.info . Під час роботи з автоматичними інструментами обов'язково перевіряйте результат.

Файли JSON (у тому числі й перетворені дані) можна перевірити за допомогою JSONLint . Щоб протестувати JSON у контексті веб-розробки, зверніться до JSFiddle .

Висновок

JSON – простий та легковажний формат даних. Файли JSON легко передавати, зберігати та використовувати.

Сьогодні JSON часто використовується в API.

Оголошення

Формат файлів JSON Website

Файли JSON використовуються для зберігання структур простих масивів даних за допомогою формату, який базується на тексті, який може прочитати людина. Спочатку файли JSON були тісно пов'язані з мовою програмування JavaScript, проте внаслідок того, що в Наразіцей формат підтримує велику кількість програмних API, його можна розглядати як формат, який не прив'язаний до жодної з мов програмування. Дана альтернатива формату XML найчастіше використовується веб-застосунками Ajax.

Технічні відомостіпро файли JSON

Файли JSON використовуються як файли для обміну даними. Такий обмін часто відбувається між комп'ютерами, підключеними через Інтернет. Таким чином, рідко файли з розширенням JSON зберігаються на жорсткому диску комп'ютера. Деякі програми, однак, все ще використовують цей формат. Наприклад, дані профілю Google+ зберігаються та завантажуються у форматі JSON, а веб-браузер Mozilla Firefoxвикористовує файли цього формату для зберігання резервних копійзакладок.

додаткова інформаціяпро формат JSON

Змінні, масиви та об'єкти - звична та зручна форма подання даних. Описувати дані прийнято в мові JavaScript, що робити не обов'язково в мові сервера PHP. Формат JSON дозволяє узагальнити їх в одне ціле і не наголошувати на мові програмування. При цьому дані перетворюються на пари: "ім'я = значення". Значення кожної з них також може бути сукупністю таких пар.

Прийнято JSON асоціювати з фігурними дужками і останнє цілком обґрунтовано, оскільки формат JSON = Object Notation JavaScript. Останні особливо динамічні роки багато що змінилося. Що створювалося заради конкретної мети, часто давало несподівані плоди або відкривало нові горизонти.

Обмін даними: браузер - сервер

Технологія AJAX стала традиційною, звичайне оновлення сторінки повністюперестало користуватися популярністю. Відвідувач, відкриваючи сайт, ініціює серію часткових обмінів даними, коли ті чи інші сторінки змінюються лише в тому місці, яке є актуальним.

Вважається, що поява JSON пов'язана з використанням саме AJAX, але насправді асоціативні та його об'єктна нотація (особливості синтаксису опису та використання об'єктів) мають набагато більш споріднене відношення до JSON, ніж обмін даними між браузером та сервером.

Оскільки контент сторінок сучасних сайтів справді став «масивним» (об'ємним), то й ефективність формату для обміну даними набула особливого значення. Не можна сказати, що JSON став новим поданням даних, але те, що він давно був елементом синтаксису JavaScript, має істотне значення.

Використання кирилиці в іменуванні змінних - дуже несподіване явище (нонсенс), але це працює в останніх версіях Chrome, Firefox і, навіть, у Internet Explorer 11.

Кирилиця та JSON

Зрозуміло, використовувати це зовсім несподіване явище не варто, нагадуючи, як легко значення змінних, записані російськими літерами, перетворюються на кракозябри: що говорити про імена, особливо зовнішні.

Сумнівно, що ініціативу в кирилиць підтримає зовнішнє оточення браузера, з яким йому постійно доводиться мати справу. Але цей факт заслуговує на увагу з тієї простої причини, що JSON формат - це можливість писати імена і значення так, як завгодно розробнику. Це важливо, оскільки в кожній задачі опис галузі застосування так, як вона цього вимагає, суттєво спрощує налагодження та зменшує кількість помилок.

Не важливо, яке саме мало під собою основу синтаксичне нововведення - JSON, важливо, що воно дало законне право та реальну можливість поставити відповідність: "будь-яке ім'я = будь-яке значення".

Треба віддати належне JavaScript: те, що передбачено синтаксисом, не зобов'язує розробника і нічого йому не нав'язує. Розробник вільно використовує синтаксис мови для оптимального формування моделі даних та алгоритму їх використання.

PHP та JSON

Приймаючи дані у форматі JSON, сервер (за допомогою PHP зокрема) надає можливість їх обробляти як є і повертати назад у браузер результат в аналогічному форматі. Початковий масив PHP:

  • $cJSON = array ("a"=> "alfa", "b"=> "beta", "g"=> "gamma").

Перетворення у формат JSON для передачі в браузер:

  • $cJS = json_encode($cJSON).

Результат:

  • ("a":"alfa","b":"beta","g":"gamma").

Допускається зображена на фото вкладеність.

Тут сформований масив був доданий новим елементом «сам у собі» з автоматичним індексом "0", а потім ще раз із зазначеним індексом "z".

Json_decode() виконує перетворення рядка JSON на масив PHP. Аналогічних результатів можна досягти, маніпулюючи функціями та explode(). У деяких випадках цей варіант є кращим.

Рівень вкладеності

Елементи можуть бути вкладені один в одного як на стороні браузера, так і сервері. На практиці формат JSON (опис стандарту RFC 4627) надає значно більше 4 рівнів вкладеності, але не слід зловживати цією можливістю.

Найкраще ніколи не виходити за межі розумної достатності, це робить код читабельним, спрощує його налагодження та розуміння іншими розробниками.

JSON прийнято відносити до конструкцій даних, які простіше за XML, зрозумілі одночасно і людям, і комп'ютерам. Це справді так, коли обсяг даних малий, а рівень вкладеності розробник вибрав грамотно. В інших випадках вважати кількість дужок і розуміти складно як на стороні браузера, так і на стороні сервера.

Файли JSON

Застосування JSON на практиці часто не обмежується доступним сприйняттю коротким рядком. Будь-які конструкції даних завжди мають прагматичний характер. При цьому JSON може ефективно застосовуватися як у реальних даних завдання (штат підприємства), так і для реалізації тимчасових даних (кеш об'єкта).

Штат підприємства та JSON-формат: приклад

Зазвичай запис про одну людину - це прізвище, ім'я, по батькові, рік народження, спеціальність, освіта, ... і ще простеньких значень. Навіть в особливо вимогливих компаніях запис про одну людину не перевищуватиме десятка-двох полів. Це доступно сприйняттю і може бути поміщено в рядок бази даних.

Якщо в компанії працює кілька людей – це одне, але якщо десятки тисяч – це зовсім інше. Можна продовжувати використовувати базу даних, але зберігання її у вигляді файлу виглядає практичнішим і доступнішим для використання.

JSON – це звичайний текстовий файл. Випадок зі штатним розкладом, куди не йшло. Прочитати його можна. Відкрити і змінити також доступно в будь-якому текстовому редакторі, який не має звички додавати свою службову інформацію до файлу. Взагалі, *.json – це чистий текст як усередині браузера, так і всередині файлу – рядок.

На фото представлений кеш об'єкта, який формує картинку, приклад.

Це приклад змісту файлу, сформованого сайтом, який надає послугу кольорового об'ємного друку на кружках та керамічних виробах. Звичайно, вирішити, маючи такий JSON-формат, ніж відкрити його, справді проблематично. Однак у цьому та подібних випадках проблем з читанням файлу не виникає: PHP читає файл, розбирає його та передає у браузер. Змінені відвідувачем дані повертаються на сервер та записуються назад.

У такому варіанті використання файл виступає як змінна, яка зберігається поза кодом. При необхідності змінна отримує значення з файлу, а якщо вона буде змінена відвідувачем у діалозі, передбаченому сайтом, то всі зміни запишуться як є. Немає необхідності читати та перевіряти вміст файлу.

JSON часто використовується для зберігання та використання службової інформації – це не штатний розклад, його не обов'язково бачити ні розробнику, ні відвідувачу сайту.

XML та JSON

"Всього свого часу" - класичне знання, прийняте за аксіому ще до появи програмування. "Ніщо не з'являється просто так", - це теж було до того, як людина написала першу зрозумілу програму штучною мовою.

Формати даних з'являються від реальної потреби та ґрунтуються на досягнутих знаннях. У HTML - свій шлях, у XML - свій шлях, а JSON - це об'єктна логіка JavaScript, розширена іншими мовами. Порівнювати одне з одним не найкраще заняття. Кожному своє.

XML чудово справляється зі своїми завданнями і йти в історію явно не збирається. А JSON використовувався і до 2006 року, просто не кожен розробник вважав за свій обов'язок декларувати ті чи інші варіанти подання своїх даних.

Були випадки на практиці, коли на бейсику були написані програми, які не використовують JSON як такий, але чудово зберігають пари "ім'я = значення" і надають їх у розпорядження потрібним алгоритмам у потрібний час.

Спецсимволи («`», «~», «|», ...) та формати даних

Звичка працювати з асоціативними масивами та об'єктами на JavaScript робить використання JSON природним та зручним. Це справді відмінний формат, але вміння розділяти і з'єднувати, маніпулюючи рядками та масивами, має куди більш глибинне коріння.

Функції join/split мови JavaScript та implode/explode мови PHP дозволяють зручно та ефективно використовувати як формати даних XML, JSON, і власний варіант. Останній часто оптимальніший, а перші два ідеально підходять для варіантів загального користування. Якщо йде передача інформації іншому розробнику, серверу, файл або базу даних, краще XML і JSON не знайти. З ними всі працюють, тому передача/прийом інформації не потребує коментарів.

Використання JSON в Android

Читання та запис даних у форматі JSON в Android - не лише норма речей, а й безліч об'єктів, орієнтованих на роботу саме з таким форматом даних.

При цьому використовується формат JSON. Можливо, це так і є, але питання не в феноменальності соцмереж, а в тому, що дійсно подання інформації у форматі "ім'я = значення" зручне як для програмування, так і для використання. На відміну від суворого та закомплексованого «XML» це справді людино-зручний формат.

Асоціативні масиви

Склалося те, що змінні слід описувати (JavaScript) чи навіть вказувати початкове значення (PHP). В обох випадках змінна може змінити свій тип дуже легко. У разі потреби мова виконує це перетворення автоматично.

Але чому змінної не змінювати також своє ім'я, не з'являтися в ході виконання алгоритму і не зникати, коли необхідність в ній відпаде? Асоціативні масиви дозволяють вирішити цю проблему, але тоді при використанні таких щодо динамічних змінних, ім'я масиву та відповідні синтаксичні конструкції йтимуть у місця їх застосування.

Особливо ця обставина яскраво виражена на PHP, але з цим можна миритися, як, втім, з символом $ в імені змінної і комбінацією $this-> всередині об'єкта. Програмуючи одночасно на JavaScript і PHP, спочатку дійсно дивуєшся, як все відрізняється, але потім все стає таким звичним і природним.

Асоціативний масив -> JSON

У цьому прикладі за допомогою бібліотеки PHPOffice/PHPWord створюється документ *.docx і масив aProperties містить властивості цього документа (автор, компанія, заголовок, категорія, дата створення...).

Другий масив містить дані по сторінці:

  • орієнтація (альбомна чи звичайна);
  • розміри по вертикалі та горизонталі;
  • відступи (поля ліворуч, зверху, знизу, праворуч);
  • колонтитули.

Формування документа виконується на сервері, де встановлена ​​бібліотека PHPOffice/PHPWord. На сайті передбачено керування значеннями цих масивів за допомогою JavaScript. Результат у форматі JSON повертається назад на сервер і використовується в алгоритмах PHP, в його конструкціях, тобто в масивах.

Динамічні змінні

Формат JSON вирішує проблему динамічних змінних. Тут можна створювати, змінювати та видаляти змінні без зайвих синтаксичних нагромаджень. Це чудово виглядає і використовується в JavaScript.

У цьому прикладі функція GetOjInfo () вибирає ім'я значення та значення об'єкта. Спочатку об'єкт JSON-рядка, присвоєної змінній ojInfo, має в своєму розпорядженні три елементи: Name, age і work. Трохи згодом додається змінна Status.

Після першого оператора delete рядок ojInfo втрачає елемент age, після другого delete - елемент work. Якщо припустити, що цей рядок є добіркою змінних, що мають певний зміст, то за допомогою JSON можна реально створювати, змінювати та видаляти будь-які їх набори поза операційним полем (синтаксисом) опису та обробки мови JavaScript.

Формат JSON на такий варіант не був розрахований, але таке можливо практично і зручно.

), і між самими серверами (програмні HTTP-інтерфейси). Формат JSON також добре підходить для збереження складних динамічних структур у реляційних базах даних або файловому кеші.

Оскільки формат JSON є підмножиною синтаксису мови JavaScript, він може бути швидко десеріалізований вбудованою функцією eval() . Крім того, можлива вставка цілком працездатних JavaScript-функцій. У PHP, починаючи з версії 5.2.0, підтримка JSON включена в ядро ​​у вигляді функцій json_decode() та json_encode() , які перетворюють типи даних JSON у відповідні типи PHP і навпаки.

Синтаксис

JSON будується на двох структурах:

  • Набір пар ключ/значення. У різних мовах це реалізовано як об'єкт, запис , структура , словник , хеш-таблиця , список із ключем або асоціативний масив . Ключом може бути лише рядок, значенням – будь-яка форма.
  • Пронумерований набір значень. У багатьох мовах це реалізовано як масив, вектор , список чи послідовність .

Це – універсальні структури даних. Теоретично, все сучасні мовипрограмування підтримують в тій чи іншій формі. Так як JSON використовується для обміну даними між різними мовами програмування, то є сенс будувати його на цих структурах.

У JSON використовуються такі форми:

  • Об'єкт - це невпорядковане безліч пар ім'я / значення, укладене у фігурні дужки ( ). Між ім'ям та значенням стоїть символ ": " , а пари ім'я/значення розділяються комами.
  • Масив (одномірний) – це безліч значень, що мають порядкові номери (індекси). Масив полягає у квадратні дужки. Значення відокремлюються комами.
  • Значення може бути рядкому подвійних лапках, числом, значенням trueабо false, об'єктом, масивом, або значенням null. Ці структури можуть бути вкладені одна в одну.
  • Рядок - це впорядковане безліч з нуля або більше символів юнікоду, укладене в подвійні лапки, з використанням escape-послідовностей, що починаються зі зворотної косої риси (backslash). Символи видаються простим рядком.
  • Ім'я – це рядок.

Рядокдуже схожа на рядок у мовах та Java. Числотеж дуже схоже на С або Java-число, за винятком того, що використовується лише десятковий формат. Пробіли можуть бути вставлені між двома символами.

Наступний приклад показує JSON-подання об'єкта, що описує людину. В об'єкті є рядковіполя імені та прізвища, об'єкт, що описує адресу, та масив, що містить список телефонів.

( "firstName" : "Іван" , "lastName" : "Іванів" , " address" : ( "streetAddress" : "Московське ш., 101, кв.101" , "city" : "Ленінград" , "postalCode" : 101101), "phoneNumbers": ["812 123-1234", "916 123-4567"]))

На мові XML подібна структура виглядала б приблизно так:

Іван Іванов Московське ш., 101, кв.101 Ленінград 101101 812 123-1234 916 123-4567

812 123-1234 916 123-4567

Порівняння з YAML

Як функціонально, так і синтаксично, JSON є підмножиною мови YAML . Зокрема, специфікація YAML 1.2 вказує, що «будь-який файл у форматі JSON є коректним файлом у форматі YAML» . Найбільш поширений парсер YAML здатний обробляти і JSON. Специфікація 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 - самоописова мова: при його використанні для обробки даних та опису їх допустимості можуть використовуватися одні й ті самі інструменти серіалізації/десеріалізації.

Використання JSON в Ajax

Наступний приклад Java-коду показує, як браузер може використовувати XMLHttpRequest , щоб запитувати з сервера об'єкт у форматі JSON (серверна частина програми опущена; в ній повинен бути розміщений код, що відправляє дані у форматі JSON-рядки у відповідь на запити по url).

Var the_object; var http_request = новий 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( " the URL." ) ; ) http_request = null ; ) ) ;

Зауважимо, що даний приклад застосування XMLHttpRequest не є універсальним для всіх браузерів (для браузерів, заснованих на Internet Explorer, Opera, Safari та Mozilla, у коді повинні бути ті чи інші відмінності). Можливості застосування XMLHttpRequest обмежені через правила обмеження домену (same origin policy): URL відповіді на запит повинен знаходитися в тому ж DNS домені, що й сервер, на якому знаходиться сторінка, яка запитує відповідь. В якості альтернативи застосовується підхід JSONP , що включає використання закодованого виклику функції, що передається між клієнтом і сервером, щоб клієнт міг завантажувати закодовані в JSON дані з сторонніх доменів, і повідомляти про завершення сторону, що викликає, хоча це призводить до деяких ризиків для безпеки і додатковим вимог до сервера.

Як варіант, у коді сторінки можна використовувати елементи для асинхронного запиту JSON даних або просто . Ці підходи були поширені до широкої підтримки XMLHttpRequest.

Також можна використовувати для передачі JSON даних динамічні теги правило обмеження домену (same origin policy), але він призводить до появи вразливого коду. Як безпечнішу альтернативу було запропоновано використовувати JSONRequest.

Питання безпеки

Хоча JSON призначений для передачі даних у серіалізованому вигляді, його синтаксис відповідає синтаксису JavaScriptі це створює низку проблем безпеки. Найчастіше для обробки даних, отриманих від зовнішнього джерела у форматі JSON, до них застосовується функція eval() без попередньої перевірки.

JavaScript eval()

Оскільки JSON є синтаксично правильним фрагментом коду JavaScript, найпростішим способом розбору JSON-даних у JavaScript-програмі є використання вбудованої в JavaScript функції eval() , яка призначена для виконання JavaScript-виразів. При цьому підході відпадає потреба у використанні додаткових парсерів.

Техніка використання eval() робить систему вразливою, якщо джерело JSON-даних не є довіреним ( англ.). Як такі дані може виступати шкідливий JavaScript код для атак класу Впровадження коду ( англ.). За допомогою цієї вразливості можна здійснювати крадіжку даних, підробку автентифікації. Проте, вразливість можна усунути рахунок використання додаткових засобів перевірки даних на коректність. Наприклад, до виконання eval() отримані від зовнішнього джерела дані можуть перевірятися за допомогою регулярних виразів. У RFC, що визначає JSON, пропонується використовувати наступний код для перевірки його відповідності формату JSON

Var my_JSON_object =! (/[^,:()\[\]0-9.\-+Eaeflnr-u \n\r\t]/ .test ( text.replace (/"(\\.|[^"\\]) )*"/g , "" ) ) ) && eval("(" + text + ")" ) ;

Як безпечніша альтернатива eval() була запропонована нова функція parseJSON(), здатна обробляти лише JSON-дані. Вона була представлена ​​в четвертій версії стандарту ECMAScript і описана у статті JSON: Знежирена альтернатива XML. В даний час вона доступна як бібліотека JavaScript і буде включена до п'ятої редакції ECMAScript.

Вбудований JSON

Останні версії веб-браузерів мають вбудовану підтримку JSON і здатні обробляти його без виклику функції eval() , що призводить до описаної проблеми. Обробка JSON у такому разі зазвичай здійснюється швидше. Так, у червні 2009 року наступні браузери мали вбудовану підтримку JSON:

Принаймні п'ять популярних бібліотек JavaScript використовують вбудований JSON у разі його доступності:

Підробка кросдоменного запиту

Непродумане використання JSON робить сайти вразливими до підробки міжсайтових запитів (CSRF або XSRF). Оскільки тег допускає використання джерела, що не належить до того ж домену, що й використовує ресурс, це дозволяє виконувати код під виглядом даних, представлених у форматі JSON, у контексті довільної сторінки, що уможливлює компрометацію паролів або іншої конфіденційної інформації користувачів, що пройшли авторизацію на іншому сайті.

Це є проблемою тільки у разі вмісту в JSON-даних конфіденційної інформації, яка може бути компрометована третьою стороною і якщо сервер розраховує на політику одного джерела ( англ.), блокуючи доступ до даних при виявленні зовнішнього запиту. Це не є проблемою, якщо сервер визначає допустимість запиту, надаючи дані лише у разі його коректності. HTTP cookie не можна використовувати для визначення цього. Виключне використання HTTP cookie використовується підробкою міжсайтових запитів.

JSONP & JSONPP

JSONP (JSON Padding) або "JSON з підкладкою" є розширенням JSON, коли ім'я функції зворотного виклику вказується як вхідний аргумент.

В основу технології покладено той факт, що політика безпеки браузера дозволяє використовувати тег для звернення до серверів, відмінних від сервера, з якого відбулося завантаження сторінки.

Без використання технології JSONP (тобто, використовуючи просто JSON кодування даних) сервер може повернути тільки дані. Наприклад так:

("paper": "A4", "count": 5)

Однак це лише дані, і вони не можуть впливати на браузер.

Використовуючи техніку JSONP, сторонньому серверу передається в рядку виклику (GET) ім'я callback функції:

Тут параметр jsonp містить ім'я callback функції parseResponse.

Тепер сторонній сервер example.com може повернути наступний код:

ParseResponse(( "paper" : "A4" , "count" : 5 ) )

Тепер код викликає JavaScript-функцію першого домену.

Спочатку ідея була запропонована в блозі MacPython в 2005 році, і в даний час використовується багатьма Web 2.0 додатками, такими як Dojo Toolkit Applications, Google Toolkit Applications і zanox Web Services. Подальші розширення цього протоколу були запропоновані з урахуванням введення додаткових аргументів, наприклад, у випадку JSONPP за підтримки S3DB веб-сервісів.

Оскільки JSONP використовує скрипт теги, виклики, по суті, відкриті світу. Тому JSONP може бути недоречним для зберігання конфіденційних даних .

Увімкнення скриптових тегів від віддалених сайтів дозволяє їм передати будь-який контент на сайті. Якщо віддалений сайт має вразливості, які дозволяють виконати Javascript ін'єкції, вихідний сайт також може бути торкнутися ними.

JSONPP (parameterized JSON with padding) Параметризований JSON з підкладкою - розвиток ідеї JSONP

JSONPP включає URL джерела, ім'я функції, яка буде обробляти JSON дані, рядок для eval після отримання даних і рядок для eval після закінчення обробки даних:

JSON_call(SRC, JSONP, JSONPP, ONLOAD);

в результаті обертається

Ans = JSONP(SRC) ( eval(JSONPP(ans) ) ; eval(ONLOAD) ; )

Взагалі для самої ідеї JSONPP не важливо кількість параметрів. Достатньо SRC, JSONP, JSONPP (і їхня обробка на стороні сервера, а потім клієнта) для того, щоб це був JSONPP.

Розглянемо з прикладу роботи з сервісом S3DB.

Function s3db_jsonpp_call(src, next_eval) ( var call = "call_" + Math .random () .toString () .replace (/\./g , "" ) ; var headID = document.getElementsByTagName ("head" ) [ 0 ] ; var script = document.createElement ("script" ) ; script.id = call; script.type = "text/javascript" ; "&onload=remove_element_by_id("" + script.id + "")" ; script.src = src; headID.appendChild (script) ; ; ) function remove_element_by_id(id) ( var e = document.getElementById (id) ; e.parentNode .removeChild (e) ; return false ; )

У прикладі функція s3db_jsonpp_call() створює в DOM частині head елемент script, src якого відповідає виклику JSONPP.

Після отримання відповіді від сервера буде викликана s3db_jsonpp() – вона передана у параметрах виклику, як це має бути за правилами JSONP.

Усередині s3db_jsonpp() спрацює eval(jsonpp) і буде повернення значення ans.

Виклик eval(onload) призводить до виконання remove_element_by_id() з id створеного скрипта в head і в результаті для його видалення, адже він вже все одно не буде використовуватися оскільки id у прикладі було згенеровано випадковим чином на початку функції s3db_jsonpp_call(). Цей виклик відповідає серверу.

Посилання на об'єкти

Стандарт JSON не підтримує посилання на об'єкти, проте Dojo Toolkit демонструє, як за допомогою додаткових угод можна забезпечити підтримку таких посилань засобами стандартного JSON. Зокрема, модуль dojox.json.ref надає підтримку кількох форм посилань, включаючи кругові, множинні, міждокументні та «ліниві» посилання.

також Примітки
  • YAML Ain't Markup Language (YAML™) Version 1.2 (англ.) . - Working Draft 2008-05-11. (недоступне посилання - історія) Перевірено 24 вересня 2009 року.
  • . RedHanded (07 квітня 2005). Перевірено 25 вересня 2012 року.
  • Json.Com JSON Schema Proposal (англ.) .(недоступне посилання - історія)
  • RFC 4627
  • JSON: Знежирена альтернатива XML (англ.) . Архівовано
  • json2.js (англ.). Архівовано з першоджерела 12 лютого 2012 року. Перевірено 24 вересня 2009 року.
  • Використання вбудованого JSON (англ.).
  • Вбудований JSON в IE8 (англ.). Архівовано з першоджерела 12 лютого 2012 року.
  • Web специфікації, що підтримуються Opera Presto 2.5 (англ.) (March 10, 2010). Архівовано з першоджерела 12 лютого 2012 року. Перевірено 29 березня 2010 року.
  • Реалізація ES 3.1 об'єкта JSON (англ.).
  • Ticket # 4429lang = en . Архівовано з першоджерела 12 лютого 2012 року.
  • Ticket #4429 (May 22, 2009). Архівовано з першоджерела 12 лютого 2012 року. Перевірено 3 липня 2009 року.
  • Ticket # 8111lang = en . Архівовано з першоджерела 12 лютого 2012 року.
  • MooTools Core & More 1.3.1. Архівовано з першоджерела 12 лютого 2012 року.
  • YUI 2: JSON utility (September 1, 2009). Архівовано з першоджерела 12 лютого 2012 року. Перевірено 22 жовтня 2009 року.
  • Learn JSON (April 7, 2010). Архівовано з першоджерела 12 лютого 2012 року. Перевірено 7 квітня 2010 року.
  • Джеремі ГроссменПросунуті техніки атак на веб-застосунки, що використовують GMail (англ.) . WhiteHat Security. Архівовано з першоджерела 12 лютого 2012 року. Перевірено 23 вересня 2009 року.
  • від __future__ import * » Remote JSON-JSONP. Bob.pythonmac.org. Архівовано з першоджерела 12 лютого 2012 року. Перевірено 8 вересня 2008 року.
  • Almeida, Jonas (June 11, 2008). JSON, JSONP, JSONPP? »(S3DB). Перевірено на 2009-04-26.
  • RIAspot JSON P для Cross Site XHR .(недоступне посилання - історія)
  • JSON referencing в Dojo. Архівовано з першоджерела 12 лютого 2012 року.
  • Посилання
    • Офіційна домашня сторінка формату російською мовою
    • json.js , json2.js - бібліотека, розроблена Дугласом Крокфордом, для роботи з даними JSON JavaScript. Розширює об'єкт Objectметодом toJSONString, який потім присутній у будь-якому об'єкті, і здійснює його перетворення на рядок формату JSON.
    • json-rpc.org (англ.)
    Розширення файлу .json
    Категорія файлів
    Файл-приклад (0,57 KiB)
    Пов'язані програми Microsoft Notepad
    Microsoft WordPad
    Notepad ++
    Mozilla Firefox
    Мови розмітки документівОфісних документів

    Знайомі з програмуванням люди одразу дізнаються про файли з розширенням JSON. Цей формат – абревіатура термінів JavaScript Object Notation, і він по суті текстовим варіантом обміну даними, що використовується в мові програмування JavaScript. Відповідно, впоратися з відкриттям таких файлів допоможе спеціалізоване ПЗ, або текстові редактори.

    Основною особливістю скриптів у форматі JSON є взаємозамінність його на формат XML. Обидва типи є текстові документи, які можна відкривати текстовими процесорами Однак почнемо ми зі спеціалізованого ПЗ.

    Спосіб 1: Altova XMLSpy

    Досить відоме середовище розробки, яке використовують у тому числі й веб-програмісти. Це середовище також генерує файли JSON, тому здатна і відкривати сторонні документи з таким розширенням.


    Недоліків у цього ПЗ два. Перший – платна основа розповсюдження. Пробна версія активна 30 днів, проте для її отримання необхідно вказати ім'я та Поштова скринька. Другий – загальна громіздкість: людині, якій просто потрібно відкрити файл, вона може здатися надто навороченою.

    Спосіб 2: Notepad++

    Багатофункціональний текстовий редактор Notepad++ - перший зі списку придатних для відкриття скриптів у форматі JSON.


    Плюсів у Notepad++ неабияк – тут і відображення синтаксису багатьох мов програмування, і підтримка плагінів, і малий розмір… Однак через деякі особливості працює програма неквапливо, особливо якщо відкрити в ній об'ємний документ.

    Спосіб 3: AkelPad

    Неймовірно простий і водночас багатий на можливості текстовий редактор від російського розробника. До підтримуваних ним форматів входить і JSON.


    Як і Notepad++, цей варіант блокнота також безкоштовний та підтримує плагіни. Він працює швидше, проте великі та складні файли може не відкрити з першого разу, так що майте на увазі таку особливість.

    Спосіб 4: Komodo Edit

    Безкоштовне ПЗ для написання програмного кодувід компанії Komodo. Відрізняється сучасним інтерфейсом та широкою підтримкою функцій для програмістів.


    У програмі, на жаль, відсутня російська. Однак рядового користувача швидше відлякає надлишковий функціонал і незрозумілі елементи інтерфейсу – все-таки цей редактор орієнтований насамперед на програмістів.

    Спосіб 5: Sublime Text

    Ще один представник code-oriented текстових редакторів. Інтерфейс простіше, ніж у колег, проте можливості ті самі. Доступна і портативна версія програми.


    На жаль, Sublime Text недоступний російською мовою. Недоліком можна назвати і умовно-безкоштовну модель поширення: вільна версія нічим не обмежена, але іноді з'являється нагадування про необхідність придбання ліцензії.

    Спосіб 6: NFOPad

    Простий блокнот, проте для перегляду документів із розширенням JSON теж підійде.



    Розповісти друзям