Формат JSON: приклад і опис

Формат JSON: приклад і опис

JSON - абревіатура від Java Script Object Notation, яка являє собою формат, який використовує текст, зрозумілий людині, для передачі даних, що складаються з пар атрибут - значення. Це найбільш поширений формат даних, який використовується для асинхронного зв 'язку між браузером і сервером, що значною мірою замінює XML (використовується AJAX).

JSON - це незалежний від мови формат даних, який був отриманий з JavaScript. З 2017 року багато мов програмування використовують код для генерації та аналізу даних тільки в нім. Імена файлів JSON використовують розширення .json.

Історія створення

Спочатку формат JSON розробив Дуглас Крокфорд на початку нульових, і в подальшому два конкуруючих стандарти (RFC 7159 і ECMA-404) визначили його в 2013 році. Стандарт ECMA описує лише допустимий синтаксис, тоді як RFC охоплює деякі основи безпеки і взаємодії.

Крім того, існує стандарт RFC 7493, який визначає обмежений профіль, відомий як I-JSON (скорочення від "Internet JSON"). Він прагне подолати деякі проблеми взаємодії. Кожен такий документ є дійсним документом JSON.

Необхідність у створенні цього формату зросла з потреби в реальному протоколі зв 'язку між сервером і браузером, здійснюваної в реальному часі без використання плагінів (таких, як Flash або Java-апплети).

Розвиток і застосування

Як вже зазначено, Дуглас Крокфорд, будучи творцем компанії StceSoftware, вперше позначив і популяризував формат JSON. Згодом співзасновники домовилися про створення системи, що використовує стандартні можливості браузера, і надали абстракційний рівень для розробників для створення додатків з безперервним дуплексним підключенням до веб-сервера. При цьому з 'явилася можливість утримувати два HTTP-з' єднання відкритими і обробляти їх до стандартного часу роботи браузера, якщо обмін даними не проводився. Співзасновники провели обговорення за круглим столом і проголосували за те, щоб назвати формат даних JSML або JSON, а також визначити тип ліцензії, за яким нова розробка стане доступна. У даний час формат має відкритий вихідний код.

Практичне використання

Веб-сайт JSON.org запустили 2002 року. У грудні 2005 року Yahoo! почав пропонувати деякі зі своїх веб-сервісів у цьому форматі. Google почав застосовувати фіди JSON для свого веб-протоколу GData тільки в грудні 2006 року.

Спочатку формат файлу JSON призначався для підмножини мови сценаріїв JavaScript (зокрема, Standard ECMA-262 3rd Edition-December) і зазвичай використовувався разом з ним. Однак це не залежний від мови даних формат. Код для розбору і генерації даних JSON доступний на багатьох мовах програмування. На веб-сайті JSON перераховані всі бібліотеки.

Незважаючи на те, що JSON-формат online спочатку рекламувався і вважався строгим підмножиною JavaScript і ECMAScript, він періодично допускає деякі символи, не екрановані в рядках, які є неприпустимими в рядках JavaScript і ECMAS

Сам по собі JSON став міжнародним стандартом ECMA в 2013 році як стандарт ECMA-404, який в тому ж році використовувався в RFC 7158 в якості посилання. У 2014 році RFC 7159 став основним посиланням на використання JSON в Інтернеті (наприклад, MIME application/json).

Типи даних, синтаксис і приклад

Основними типами даних JSON є:

  • Число: десяткове число зі знаком, яке може містити дробову частину і може використовувати експоненціальну нотацію E, але не може включати не-числа (наприклад, NaN). Формат не робить відмінностей між цілими і числами з плаваючою комою. JavaScript використовує формат подвійної точності з плаваючою комою для всіх своїх числових значень, але інші мови, що реалізують JSON, можуть кодувати їх по-різному.
  • Рядок: послідовність з нуля або великих символів Unicode. Рядки поділяються знаками подвійних лапок і підтримують синтаксис зворотною косою рисою.
  • Літерали: будь- яка з значень true або false.
  • Масив: впорядкований список з нуля або більше значень, кожен з яких може бути будь-якого типу. Масиви використовують квадратні дужки з комами.
  • Об 'єкт: неупорядкований набір пар ім 'я/значення, де імена (також звані ключами) є рядками. Оскільки об 'єкти призначені для представлення масивів асоціації, рекомендується (хоча й не обов' язково), щоб кожен ключ був унікальним всередині нього. Об 'єкти поділяють фігурними дужками і використовують коми для поділу кожної пари, в той час як всередині кожної з них символ двокрапки відокремлює ключ або ім' я від його значення.
  • Null: Порожнє значення, яке використовує слово null.

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

Ранні версії (наприклад, вказані в RFC 4627) вимагали, щоб дійсний документ складався тільки з об 'єкта або типу масиву, який міг містити інші типи всередині них. Такий JSON-формат, приклад якого можна знайти на застарілих веб-сторінках, в даний час не використовується.

Проблеми з переносністю даних

Незважаючи на те, що Дуглас Крокфорд спочатку стверджував, що JSON є строгим підмножиною JavaScript, його специфікація фактично дозволяє створювати документи, нечитані в JavaScript. Зокрема, JSON допускає, щоб значення рядків Unicode U + 2028 LINE SEPARATOR і U + 2029 PARAGRAPH SEPARATOR виглядали неекранованими в цитованих рядках, а JavaScript - ні. Це є наслідком того, що JSON забороняє тільки "керуючі символи". Для максимальної сумісності ці символи повинні бути екрановані зі зворотною косою рисою. Ця тонкість важлива при створенні JSONP.

JSON-формат: чим відкрити?

Документи JSON можуть кодуватися в UTF-8, UTF-16 або UTF-32, кодування за замовчуванням - UTF-8. Ці стандарти підтримують повний набір символів "Юнікода", включаючи символи поза основною багатомовною площиною (від U + 10000 до U + 10FFFF). Однак, якщо вони екрановані, ці символи повинні бути написані з використанням сурогатних пар UTF-16 - деталі, що пропускається деякими аналізаторами JSON-формат. Чим відкрити і як буде прочитано такий файл?

Числа в цьому форматі є агностичними щодо їх представлення в мовах програмування. Немає жодної відмінності між цілим числом і значенням з плаваючою комою: деякі реалізації можуть розглядати 42, 42.0 і 4.2E + 1 як одне і те ж число, в той час як інші можуть не робити цього. Крім того, відсутні вимоги щодо таких питань, як переповнення, недостатність, втрата точності або округлення. Крім того, формат JSON нічого не говорить про обробку підписаних нулів, незалежно від того, чи є 0.0 відмінним від -0.0. Більшість реалізацій, що використовують стандарт IEEE 754 з плаваючою комою, включаючи JavaScript, зберігають знакові нулі, але не всі реалізації JSON можуть це робити.

Використання JavaScript

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

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

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

З 2010 року в таких веб-браузерах як Firefox і Internet Explorer включена підтримка аналізу і вивантаження в JSON-формат.

Непідтримані власні типи даних

Синтаксис JavaScript визначає декілька власних типів даних, які не включені до стандарту JSON: Карта, Встановити, Дата, Помилка, Формальний вираз, Функція та деякі інші. Ці типи даних JavaScript повинні бути представлені деякими іншими форматами, при цьому обидві програми узгоджують спосіб перетворення між типами. Сьогодні існують деякі стандарти defacto, наприклад, перетворення дати на рядок, але жоден з них не є загальновизнаним. Інші мови можуть мати різний набір власних типів, які повинні бути серіалізовані ретельно, щоб мати справу з цим типом перетворення.

Схема JSON

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

Схема заснована на концепціях з XML Schema (XSD), але є власною. Як і в XSD, використовуються ті ж засоби серіалізації/десеріалізації як для схеми, так і для даних.

Schema - це інтернет-проект, який зараз перебуває в 5-й версії (випущеній 13 жовтня 2016 року). Існує декілька валідаторів, доступних для різних мов програмування, кожна з яких має різний рівень відповідності. Стандартного розширення файлів немає, але деякі фахівці пропонують затвердити .schema.json.

Тип MIME

Офіційним типом MIME для тексту JSON є "application/json". Незважаючи на те що в більшості сучасних реалізацій прийнятий офіційний MIME-тип, багато додатків продовжують забезпечувати успадковану підтримку інших типів MIME. Багато постачальників послуг, браузерів, серверів, веб-програм, бібліотек, кадрів та API використовують, очікують або розпізнають тип MIME, вміст якого виглядає як "текст/json" або "текст/javascript". Відомі приклади включають Google Search API, Yahoo!, Flickr, Facebook API, DojoToolkit 0.4 і так далі.

JSON-RPC

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

AJAJ

Асинхронний JavaScript і JSON (або AJAJ) відносяться до тієї ж динамічної методології веб-сторінок, що і Ajax, але замість XML саме формат даних JSON є основним. AJAJ - це технологія веб-розробки, яка забезпечує можливість веб-сторінки запитувати нові дані після завантаження в браузер. Зазвичай він показує їх з сервера у відповідь на дії користувача на цій сторінці. Наприклад, те, що користувач вводить в поле пошуку, клієнтський код потім відправляє на сервер, який відразу ж відповідає розкривається списком відповідних елементів бази даних.

Безпекові проблеми

Текст у JSON-форматі визначається як об 'єкт серіалізації даних. Однак його дизайн, як нестроге підмножина мови сценаріїв JavaScript, створює кілька проблем безпеки. Вони зосереджені на використанні інтерпретатора "Яваскрипт" "для динамічного виконання тексту JSON, як вбудованого JavaScript. Це піддає програму помилковим або зловмисним скриптам. Це серйозна проблема при роботі з даними, що витягуються з Інтернету.

Цей простий і популярний, але ризикований метод використовує сумісність з функцією JavaScripteval.

Деякі розробники помилково вважають, що текст у форматі JSON також є синтаксично аналогічним кодом JavaScript, хоча це тільки частково вірно. Тому вважається, що простий спосіб для JavaScript-програми аналізувати дані в цьому форматі - використання вбудованої функції JavaScripteval, яка була розроблена для оцінки виразів "" Яваскрипт "". Замість використання специфічного парсера сам інтерпретатор, таким чином, використовується для виконання даних JSON, створюючи природні JavaScript-об 'єкти. Однак цей метод є ризикованим, якщо є ймовірність, що дані JSON можуть містити довільний код "" Яваскрипт "", який потім буде виконаний так само. Якщо спочатку не буде вжито заходів для перевірки даних, метод eval схильний до вразливостей безпеки, коли дані і все середовище JavaScript не знаходяться під контролем одного довіреного джерела.

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

Таким чином, нова функція JSON.parse була розроблена як більш безпечна альтернатива eval. Вона спеціально призначена для обробки даних саме JSON, а не JavaScript. Спочатку вона була запланована для включення в четверте видання стандарту ECMAScript, але цього не сталося. Вона була вперше додана в п 'яту версію і тепер підтримується основними браузерами.