JSON

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск
JSON <tr><th style="white-space:nowrap;">Расширение файла:</th><td>.json</td></tr><tr><th style="white-space:nowrap;">Тип MIME:</th><td>application/json</td></tr> <tr><th style="white-space:nowrap;">Тип формата:</th><td>Data interchange</td></tr><tr><th style="white-space:nowrap;">Расширение для:</th><td>JavaScript</td></tr><tr><th style="white-space:nowrap;">Стандарт:</th><td>RFC 4627</td></tr>
Website http://json.org

JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.


Содержание

Использование

Практическая польза использования JSON открывается при использовании технологии AJAX. Формат JSON является более кратким и удобочитаемым по сравнению с XML, является «родным» для Javascript (преобразуется в структуру данных встроенной функцией eval()). Кроме того, в JSON-код возможна вставка вполне работоспособных функций.

Синтаксис

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 подобная структура выглядела бы примерно так:

<person>
  <firstName>Иван</firstName>
  <lastName>Иванов</lastName>
  <address>
    <streetAddress>Московское ш., 101, кв.101</streetAddress>
    <city>Ленинград</city>
    <postalCode>101101</postalCode>
  </address>
  <phoneNumbers>
    <phoneNumber>812 123-1234</phoneNumber>
    <phoneNumber>916 123-4567</phoneNumber>
  </phoneNumbers>
</person>

Сравнение с YAML

Как функционально, так и синтаксически JSON является подмножеством языка YAML. В частности, спецификация YAML 1.2 указывает, что «любой файл в формате JSON является корректным файлом в формате YAML»[1]. Наиболее распространенный парсер YAML способен обрабатывать и JSON.[2] Спецификация 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 — самоописательный язык: при его использовании для обработки данных и описания их допустимости могут использоваться одни и те же инструменты сериализации/десериализации.[3]

Использование 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 = eval( "(" + http_request.responseText + ")" );
        } else {
            alert( "There was a problem with the URL." );
        }
        http_request = null;
    }
};

Заметим, что использование XMLHttpRequest в данном примере не является универсальным; синтаксические варианты доступны для браузеров основанных на Internet Explorer, Opera, Safari и Mozilla. Полезность XMLHttpRequest ограничивается политикой ограничения домена: URL ответа на запрос должен проживать в том же DNS домене, что и сервер, на котором находится страница, содержащая запрос. В качестве альтернативы, подход JSONP включает в себя использование закодированного вызова функции, передающегося между клиентом и сервером, чтобы клиент мог загружать закодированные в JSON данных из сторонних доменов, и уведомлять о завершении вызывающую сторону, хотя это приводит к некоторым рискам для безопасности и дополнительным требованиям к серверу.

Браузеры могут также использовать элементы <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[4] предлагается использовать следующий код для проверки его соответствия формату JSON

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

Как более безопасная альтернатива eval() была предложена новая функция parseJSON(), способная обрабатывать только JSON-данные. Она была представлена в четвёртой версии стандарта ECMAScript и описана в статье "JSON: Обезжиренная альтернатива XML"[5]. В настоящее время она доступна как библиотека JavaScript[6] и будет включена в пятую редакцию ECMAScript.

Встроенный JSON

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

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

Подделка кроссдоменного запроса

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

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


JSONP

JSONP или «JSON с подкладкой» является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента. Первоначально идея была предложена в блоге MacPython в 2005 м году [13] , и в настоящее время используется многими Web 2.0 приложениями, такими, как Dojo Toolkit Applications, Google Toolkit Applications [1] и zanox Web Services. Дальнейшие расширения этого протокола были предложены с учетом ввода дополнительных аргументов, как, например, в случае JSONPP [14] при поддержке S3DB вебсервисов.

Поскольку JSONP использует скрипт теги, вызовы по сути открыты миру. По этой причине, JSONP может быть неуместными для хранения конфиденциальных данных.[15]

Включение скриптовых тегов от удаленных сайтов позволяет им передать любой контент на сайте. Если удаленный сайт имеет уязвимости, которые позволяют выполнить Javascript инъекции, то исходный сайт также может быть затронут ими.

Объект ссылки

Стандарт JSON не поддерживает ссылки объекта, но Dojo Toolkit иллюстрирует, как конвенции могут быть приняты для оказания поддержки таких ссылок с помощью стандартов JSON. В частности, dojox.json.ref модуль обеспечивает поддержку нескольких форм, включая круговые ссылки, несколько, в-сообщение, и ленивые ссылки.[16]

См. также

Примечания

  1. YAML Ain’t Markup Language (YAML™) Version 1.2 (англ.). — Working Draft 2008-05-11. Проверено 24 сентября 2009.
  2. YAML is JSON. RedHanded (08 апреля 2005). Проверено 24 сентября 2009..
  3. Json.Com JSON Schema Proposal (англ.).
  4. RFC 4627
  5. JSON: Обезжиренная альтернатива XML (англ.).
  6. json2.js (англ.). Проверено 24 сентября 2009.
  7. Использование встроенного JSON (англ.).
  8. Встроенный JSON в IE8 (англ.).
  9. Реализация ES 3.1 объекта JSON (англ.).
  10. Ticket #4429lang=en.
  11. Ticket #8111lang=en.
  12. Джереми Гроссмэн Продвинутые техники атак на веб-приложения, использующие GMail (англ.). WhiteHat Security. Проверено 23 сентября 2009.
  13. from __future__ import * » Remote JSON - JSONP. Bob.pythonmac.org. Проверено 8 сентября 2008.
  14. Almeida, Jonas (June 11, 2008)."JSON, JSONP, JSONPP?". S3DB. Проверено 26 апреля 2009.
  15. RIAspot JSON P for Cross Site XHR.
  16. JSON referencing in Dojo.

Внешние ссылки

cs:JavaScript Object Notation de:JavaScript Object Notation en:JSON es:JSON fi:JSON fr:JavaScript Object Notation he:JSON id:JSON it:JSON ja:JavaScript Object Notation ko:JSON lv:JSON nl:JSON no:JSON pl:JSON pt:JSON ro:JSON sv:JSON ta:யேசண் th:เจซอน tr:JSON uk:JSON zh:JSON

Источник — «http://www.sbup.com/wiki/JSON»
Личные инструменты

Served in 0.437 secs.