JSON

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
JSON
Розширення файлу:.json
MIME-тип:application/json
Узагальнений ідентифікатор типу:public.json
Тип формату:Data interchange
Розширений з:JavaScript
Стандарт(и):RFC 7159, ECMA-404
Сайт:json.org

JSON (англ. JavaScript Object Notation, укр. запис об'єктів JavaScript, вимовляється джéйсон[1]) — це текстовий формат обміну даними між комп'ютерами. JSON базується на тексті, може бути прочитаним людиною. Формат дає змогу описувати об'єкти та інші структури даних. Цей формат використовується переважно для передавання структурованої інформації через мережу (завдяки процесу, що називають серіалізацією).

Розробив і популяризував формат Дуглас Крокфорд.

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

Історія

[ред. | ред. код]

JSON з'явився через необхідність обміну даними із сервером у реальному часі без використання плагінів для браузерів, flash-додатків або Java-аплетів, які використовувались скрізь на початку 2000-х років.

Дуглас Крокфорд був тим, хто активно просував новий на той час формат. Він із колегами хотів створити технологію, яка використовувала б можливості звичайного браузера і давала б веброзробникам можливість створювати вебдодатки із постійним двостороннім зв'язком із вебсервером. JSON вперше був використаний в проекті в Communities.com для Cartoon Network, він дозволяв обмінюватися повідомленнями й одночасно маніпулювати DHTML-елементами.

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

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

[ред. | ред. код]

За рахунок своєї лаконічності в порівнянні з 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 використовуються такі їхні форми:

  • Об'єкт — це послідовність пар назва/значення. Об'єкт починається з символу { і закінчується символом }. Кожне значення слідує за : і пари назва/значення відділяються комами. Як значення можуть виступати
  • Масив — це послідовність змінних. Масив починається символом [ і закінчується символом ]. Значення відділяються комами.
  • Змінна може бути рядком (див. нижче) в подвійних лапках, або числом, або логічними true чи false, або null, або об'єктом, або масивом. Ці структури можуть бути вкладені одна в одну.
  • Рядок — це послідовність з нуля або більше символів юнікода, обмежена подвійними лапками, з використанням escape-послідовностей, що починаються зі зворотної косої риски \. Символи представляються простим рядком.

Тип Рядок (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[2] пропонується використовувати такий код для перевірки його відповідності формату JSON

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

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

Для синтаксичного розбору JSON може використовуватися функція JSON.parse[4].

Вбудований JSON

[ред. | ред. код]

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

  • Mozilla Firefox 3.5+, SeaMonkey 2, та Thunderbird 3[5]
  • Microsoft Internet Explorer 8Native JSON in IE8. Архів оригіналу за 12 лютого 2012. Процитовано 5 серпня 2009. (англ.)
  • Opera 10.5+[6]
  • Браузери, засновані на WebKit (наприклад, Google Chrome, Apple Safari)[7]

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

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

[ред. | ред. код]

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

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

Розширення

[ред. | ред. код]

JSONP або «JSON з підкладкою» є розширенням JSON, коли назва функції зворотного виклику вказується як вхідний аргумент. Спочатку ідея була запропонована в блозі MacPython в 2005 році[11], і в наш час[коли?] використовується багатьма Web 2.0 застосунками, такими, як Dojo Toolkit Applications, Google Toolkit Applications[12] і zanox Web Services. Подальші розширення цього протоколу були запропоновані з урахуванням введення додаткових аргументів, як, наприклад, у разі JSONPP[13] за підтримки вебсервісів S3DB.

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

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

Докладніше: BSON

BSON — це бінарна форма представлення простих структур даних і асоціативних масивів (які називають об'єктами або документами). Назва «BSON» заснована на визначенні JSON і неофіційно означає «Binary JSON» (бінарний JSON).

HOCON ("Human-Optimized Config Object Notation") - формат для людиночитанних даних[en], який є надмножиною JSON.[15]

  • Перш за все використовується разом з фреймворком Play,[16] і розробляється в Lightbend Inc..
  • Також підтримується як формат конфігурації для .NET проектів через Akka.NET[17][18] і Puppet.[19]
  • TIBCO Streaming:[20] HOCON є основним форматом конфігураційного файлу для продуктів сімейства TIBCO Streaming[21] (StreamBase, LiveView, і Artifact Management Server) починаючи з релізу TIBCO Streaming 10.[22]
  • Це також основний формат конфігураційного файлу для декількох підсистем Exabeam Advanced Analytics.[23]
  • Jitsi використовує його як "нову" систему конфігурації та файли .properties як резервний варіант[24][25]

JSON Reference

[ред. | ред. код]

Стандарт JSON не описує посилання на інші об'єкти або частини, але існує чернетка стандарту IETF для посилань на об'єкти на основі JSON.[26] Посилання дозволяють здійснювати трансклюзію — вставляти одні документи в інші.

JSON Reference — це JSON-об'єкт з ключем $ref (всі інші ключі ігноруються) і значенням стрічкового типу що містить URI, наприклад[26]:

{ "$ref": "http://example.com/example.json#/foo/bar" }

Якщо URI містить ідентифікатор фрагмента[en] (в прикладі вище "/foo/bar"), він інтерпретується як JSON Pointer[26].

Модуль dojox.json.ref в Dojo toolkit, забезпечує підтримку декількох форм JSON Reference[27].

JSON Pointer

[ред. | ред. код]

https://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-04 [Архівовано 14 грудня 2018 у Wayback Machine.]

Порівняння з іншими форматами

[ред. | ред. код]

Детальніше: Порівняння форматів серіалізації даних[en]

Як функціонально, так і синтаксично JSON є підмножиною мови YAML. Зокрема, специфікація YAML 1.2 указує, що «будь-який файл у форматі JSON є коректним файлом у форматі YAML»[28]. Найпоширеніший парсер YAML здатний обробляти й JSON[29]. Специфікація YAML до версії 1.2 не повністю покривала JSON, насамперед через відсутність рідної підтримки UTF-32 в YAML, а також вимоги пропуску після роздільника-коми. Крім того, специфікація JSON включала коментарі в стилі /* */.

Найважливішою відмінністю YAML є набір розширень синтаксису, для яких немає аналогів у JSON:

Реляційний
YAML підтримує реляційні дані: в YAML-документі можна посилатися на якір, що зустрівся раніше у файлі/потоці. Таким чином можна представити рекурсивні структури.
Розширюваний
YAML підтримує розширювані типи даних крім примітивів (тобто рядків, чисел, логічних змінних).
Блоки:
у YAML доступний блоковий синтаксис з відступами; він дає змогу описати структуровані дані без використання зайвих символів (всіляких дужок, лапок тощо).

JSON Schema

[ред. | ред. код]

JSON Schema — одна з мов опису структури JSON документа. Використовує синтаксис JSON. Базується на концепціях XML Schema, RELAX NG, Kwalify. JSON Schema — самоописова мова: при її використанні для обробки даних і опису їхньої допустимості можуть використовуватись однакові інструменти серіалізації/десеріалізації[30].

Див. також

[ред. | ред. код]
  • jq — мова програмування розроблена для роботи з JSON

Виноски

[ред. | ред. код]
  1. Douglas Crockford: pronouncing "JSON" (англ.). 8 червня 2021. Архів оригіналу за 24 червня 2021. Процитовано 14 лист. 2014р.
  2. RFC 4627
  3. Douglas Crockford. JSON: The Fat-Free Alternative to XML. Архів оригіналу за 12 лютого 2012. Процитовано 19 серпня 2009.
  4. JSON.parse(). Архів оригіналу за 26 липня 2019. Процитовано 27 липня 2019.
  5. Using native JSON. Архів оригіналу за 5 березня 2012. Процитовано 19 серпня 2009. (англ.)
  6. Web specifications supported in Opera Presto 2.5. 10 березня 2010. Архів оригіналу за 12 лютого 2012. Процитовано 29 березня 2010.(англ.)
  7. Implement ES 3.1 JSON object. Архів оригіналу за 21 січня 2019. Процитовано 5 серпня 2009. (англ.)
  8. Ticket #4429. Архів оригіналу за 12 лютого 2012. Процитовано 19 серпня 2009. (англ.)
  9. Ticket #8111. Архів оригіналу за 12 лютого 2012. Процитовано 19 серпня 2009. (англ.)
  10. Advanced Web Attack Techniques using GMail [Архівовано 2013-02-12 у Wayback Machine.] — Джеремі Гроссмен, WhiteHat Security (англ.)
  11. from __future__ import * » Remote JSON — JSONP. Bob.pythonmac.org. Архів оригіналу за 12 лютого 2012. Процитовано 8 вересня 2008.
  12. GWT Tutorial: How to Read Web Services Client-Side with JSONP. Архів оригіналу за 17 січня 2013. Процитовано 19 серпня 2009.
  13. Almeida Jonas. JSON, JSONP, JSONPP?. — S3DB, . Архівовано з джерела 15 лютого 2017. Процитовано 2009-04-26.
  14. RIAspot. JSON P for Cross Site XHR. Архів оригіналу за 5 грудня 2008. Процитовано 19 серпня 2009.
  15. config/HOCON.md at master · lightbend/config. GitHub (англ.). Процитовано 5 серпня 2021.
  16. Config File - 2.5.x. www.playframework.com. Процитовано 5 серпня 2021.
  17. Akka.NET HOCON Docs
  18. Akka.NET Documentation | Akka.NET Documentation. getakka.net. Процитовано 5 серпня 2021.
  19. Керування конфігураційними файлами HOCON з Puppet. Архів оригіналу за 11 лютого 2017. Процитовано 27 травня 2023.
  20. StreamBase Documentation. docs.streambase.com. Процитовано 5 серпня 2021.
  21. Configuration Guide. docs.streambase.com. Процитовано 5 серпня 2021.
  22. StreamBase New and Noteworthy Archive. docs.streambase.com. Процитовано 5 серпня 2021.
  23. Примітки до випуску Exabeam Advanced Analytics. Архів оригіналу за 20 жовтня 2020. Процитовано 27 травня 2023.
  24. JITSI Project. Config phase 1. GitHub. Процитовано 16 лютого 2021.
  25. JITSI Project. reference.conf. GitHub. Процитовано 16 лютого 2021.
  26. а б в Zyp, Kris (16 вересня 2012). Bryan, Paul C. (ред.). JSON Reference: draft-pbryan-zyp-json-ref-03. Internet Engineering Task Force. Архів оригіналу за 19 вересня 2018. Процитовано 25 травня 2018.
  27. JSON referencing in Dojo. Архів оригіналу за 12 лютого 2012. Процитовано 19 серпня 2009.
  28. YAML Ver.1.2 Working Draft. Архів оригіналу за 16 травня 2008. Процитовано 5 серпня 2009.
  29. YAML is JSON [Архівовано 14 вересня 2008 у Wayback Machine.], RedHanded, 08 апреля 2005.
  30. Json.Com. JSON Schema Proposal. Архів оригіналу за 14 травня 2008. Процитовано 5 серпня 2009.

Посилання

[ред. | ред. код]

Підручники

[ред. | ред. код]