Смотреть что такое "JSON" в других словарях. Формат JSON: пример и описание Пример использования 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

Следующий пример Javascript-кода показывает, как браузер может использовать XMLHttpRequest , чтобы запрашивать с сервера объект в формате JSON (cерверная часть программы опущена; в ней должен быть размещён код, отправляющий данные в формате JSON-строки в ответ на запросы по url).

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 не является универсальным для всех браузеров (для браузеров, основанных на 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" ; // using padded, parameterized json src = src+ "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval+ "&onload=remove_element_by_id("" + script.id + "")" ; script.src = src; headID.appendChild (script) ; // retrieve answer } function s3db_jsonpp(ans, jsonpp) { eval(jsonpp) ; return ans; } 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.
  • from __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 for Cross Site XHR .(недоступная ссылка - история )
  • JSON referencing in Dojo . Архивировано из первоисточника 12 февраля 2012.
  • Ссылки
    • Официальная домашняя страница формата на русском языке
    • json.js , json2.js - библиотека, разработанная Дугласом Крокфордом, для работы с данными JSON в JavaScript. Расширяет объект Object методом toJSONString, который затем присутствует в любом объекте, и осуществляет его преобразование в строку формата JSON.
    • json-rpc.org (англ.)
    Языки разметки документов Офисных документов

    Переменные, массивы и объекты - привычная и удобная форма представления данных. Описывать данные принято в языке браузера 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 на такой вариант не был рассчитан, но такое возможно, практично и удобно.

    JSON - это текстовый формат записи данных. Он позволяет в текстовом виде представить как отдельное число или строку, так и сложные структуры, например, массивы с данными. Использование этого формата записи удобно тем, что он читабелен и интуитивно понятен, в то же время позволяет сохранять очень сложные структуры данных. Кроме того, он более компактный, чем xml, поэтому на мой взгляд более предпочтителен для обмена данными между веб-браузером и сервером.

    Синтаксис JSON на примерах

    Формат json обычно записывается в 2-х вариантах:

    1. Последовательность значений. Например, последовательность 10, 15 и "test" в формате JSON будут выглядеть так:

    2. Запись в виде пар ключ: значение . Например:

    {"ФИО":"Иванов Сергей", "Дата рождения":"09.03.1975"}

    Немного более сложный пример:

    { "ФИО" : "Иванов Сергей", "Адрес" : { "Город" : "Москва", "Улица" : "Пятницкая", "Дом" : "35" } }

    PHP функции для работы с JSON-форматом

    В языке php начиная с версии 5.2. есть всего 4 функции:

    • json_decode - Декодирует строку JSON (из строки json-формата получает данные)
    • json_encode - Возвращает JSON-представление данных (преобразует данные в json-строку)
    • json_last_error_msg - Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
    • json_last_error - Возвращает последнюю ошибку

    В основном по-большей части, используются всего две функции: json_encode и json_decode . Не буду вдаваться в подробности их синтаксиса, подробнее можете посмотреть на php.net . Пример использования:

    $arr1 = array(0,1,2); $json_str = json_encode($arr1); echo $json_str; // выведет json-строку: $arr2 = json_decode($json_str); echo $arr2; // выведет: 1

    Обратите внимание : при кодировании в JSON-формат данных на русском языке , функция json_encode преобразует русские символы в юникод , т.е. заменяет их на \uXXXX и таким образом, json-строка становится не читабельной для человека (но понятной для браузера). Если нужно, чтобы преобразования в юникод не происходило (например, при отладке кода), можно просто использовать опцию JSON_UNESCAPED_UNICODE.

    Так же, чтобы при кодировании не добавлялись слэши для экранирования и чтобы строки с числами кодировались как числа, можно использовать JSON_UNESCAPED_SLASHES и JSON_NUMERIC_CHECK. В итоге, чтобы json-строка была читабельной для человека, сделаем, например, так:

    $arr = array("fio" => "Иванов Сергей", "age" => "32", "vk_url" => "https://vk.com/id11111"); echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

    Без использования этих опций строка была бы такой:

    { "fio" : "\u0418\u0432\u0430\u043d\u043e\u0432 \u0421\u0435\u0440\u0433\u0435\u0439", "age" : "32", "vk_url":"https:\/\/vk.com\/id11111" }

    а с использованием опций, получим читабельную строку:

    { "fio" : "Иванов Сергей", "age" : 32, "vk_url" : "https://vk.com/id11111" }

    Еще один момент: если нужно чтобы при декодировании json-строки функция json_decode возвращала именно массив , просто добавьте второй параметр в функцию равный true.

    $json_str = "{ "a":1, "b":2, "c":3 }"; $obj = json_decode($json_str); // получим объект echo $obj->a; // выведет 1 $arr = json_decode($json_str, true); // получим ассоциативный массив echo $arr["a"]; // выведет 1

    На этом рассмотрение php-функций завершу.

    JavaScript функции для работы с JSON-форматом

    Начнем с того, что JSON-формат, изначально был придуман для языка JavaScript и потом стал просто отдельным текстовым форматом, используемым в разных языках. Видимо, поэтому синтаксис JSON очень похож на синтаксис записи обычных объектов и массивов.

    // Пример массива в JavaScript arr = ; alert(arr); // выведет 1 // Пример объекта в JavaScript obj = { "name": "Вася", "age": 35, "isAdmin": false } alert(obj.name); // выведет "Вася"

    Функции JavaScript, используемые для преобразования в JSON-формат и обратно:

    • JSON.parse - декодирование JSON-строки (преобразование строки в объекты и/или массивы)
    • JSON.stringify - возвращает JSON-представление данных (преобразование объектов и/или массивов в json-строку)

    Простой пример декодирования json-строки в массив с цифрами:

    Str = ""; arr = JSON.parse(str); alert(arr); // выведет 1

    Пример преобразования (сериализации) объекта в JSON-строку:

    Obj = { "name": "Вася", "age": 35, "isAdmin": false } alert(JSON.stringify(obj)); // выведет {"name":"Вася","age":35,"isAdmin":false}

    При сериализации (преобразовании) объекта в JSON-строку, вызывается метод toJSON этого объекта, если он существует. Если метода нет, тогда перечисляются все свойства объекта. Пример преобразования объекта с методом toJSON:

    Obj = { "name": "Вася", "age": 35, "isAdmin": false, toJSON: function() { return this.age; } } alert(JSON.stringify(obj)); // выведет 35

    Примеры практического применения JSON-формата

    Собственно, лично я, применяю формат JSON в 2-х основных ситуациях:

    1. Передача данных между браузером и сервером с использованием Ajax-запросов.

    Например, у нас есть какая-то страница, на которой нужно обновить данные без перезагрузки страницы. Допустим, нужно чтобы с сервера "подгрузилась" информация со списком сотрудников и их данными.

    В JavaScript с помощью jQuery делаем простой и выводим данные в виде таблицы в браузер:

    $.getJSON("get-info.php").success(function(data) { // ajax-запрос, данные с сервера запишутся в переменную data htmlstr = "

    "; for (var i=0; i "Иванов Сергей", "birthday" => "09.03.1975"); $user_info = array ("fio" => "Петров Алексей", "birthday" => "18.09.1983"); echo json_encode($user_info); exit;

    В этом примере JSON-строка, которая была передана с сервера в браузер была такой:

    [{"fio":"Иванов Сергей","birthday":"09.03.1975"},{"fio":"Петров Алексей","birthday":"18.09.1983"}]

    Я специально не стал показывать строку в виде "дерева", т.к. она передается именно в таком виде. И как вы можете оценить, запись данных в формате JSON получилась очень компактной , а это значит, что передача этих данных от сервера к браузеру будет практически мгновенной.

    2. Запись сложных структур данных в базу данных.

    Иногда бывают ситуации, когда заводить еще одну таблицу в базе данных не целесообразно, чтобы сохранить различные данные. Допустим, предположим, у зарегистрированного на сайте пользователя есть возможность сделать настройку цвета фона и цвета текста.

    Вместо того, чтобы заводить еще одну таблицу ради 2-х настроек, можно просто в таблице со списком пользователей сделать текстовый столбец, в который помещать данные настроек пользователя. Тогда запрос обновления настроек, может например, быть таким:

    UPDATE users SET settings = "{"background-color":"#FFFFFF", "text-color":"#000000"}" WHERE user_id = 10

    В будущем, получив из таблицы users информацию, скрипт php может легко превратить их обратно в массив с настройками. Например, если переменная $user_info содержит данные, полученные по пользователю из таблицы users, получить массив с настройками очень просто:

    $settings = json_decode($user_info["settings"], true); echo "Цвет фона = ".$settings["background-color"]; echo "Цвет текста = ".$settings["text-color"];

    В формате JSON, можно так же, например, записать в базу данных какие опции товаров выбрал покупатель.

    {"15":["45","47"], "18":"52"} // у опции 15 выбраны значения 45 и 47, а у опции 18 выбрано значение 52

    Впринципе, можно даже и всё содержимое корзины записать в формате JSON, например, так:

    { "user_id" : 10, "session_id" : "2c2l3h4ii271aojentejtdcmh3", "products": [ { "product_id" : 15, "options" : { "15" : , "18" : 52 }, "quantity" : 1, "price" : 1500 }, { "product_id" : 16, "options" : { "15" : , "18" : 51 }, "quantity" : 2, "price" : 1000 } ] }

    В обычном не древовидном виде эта JSON-строка будет такой:

    {"user_id":10,"session_id":"2c2l3h4ii271aojentejtdcmh3","products":[{"product_id":15,"options":{"15":,"18":52},"quantity":1,"price":1500},{"product_id":16,"options":{"15":,"18":51},"quantity":2,"price":1000}]}

    Таким образом, как видно из примеров, в формате JSON можно хранить и передавать практически любую информацию.

    JSON (JavaScript Object Notation) - простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript , определенного в стандарте ECMA-262 3rd Edition - December 1999 . JSON - текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.

    JSON основан на двух структурах данных:

    • Коллекция пар ключ/значение. В разных языках, эта концепция реализована как объект , запись, структура, словарь, хэш, именованный список или ассоциативный массив.
    • Упорядоченный список значений. В большинстве языков это реализовано как массив , вектор, список или последовательность.

    Это универсальные структуры данных. Почти все современные языки программирования поддерживают их в какой-либо форме. Логично предположить, что формат данных, независимый от языка программирования, должен быть основан на этих структурах.

    В нотации JSON это выглядит так:

    Объект - неупорядоченный набор пар ключ/значение. Объект начинается с { открывающей фигурной скобки и заканчивается } закрывающей фигурной скобкой. Каждое имя сопровождается: двоеточием, пары ключ/значение разделяются, запятой.

    Массив - упорядоченная коллекция значений. Массив начинается с [ открывающей квадратной скобки и заканчивается ] закрывающей квадратной скобкой. Значения разделены, запятой.


    Значение может быть строкой в двойных кавычках, числом , true , false , null , объектом или массивом . Эти структуры могут быть вложенными.


    Строка - коллекция нуля или больше символов Unicode, заключенная в двойные кавычки, используя \ обратную косую черту в качестве символа экранирования. Символ представляется как односимвольная строка. Похожий синтаксис используется в C и Java.


    Число представляется так же, как в C или Java, кроме того, что используется толко десятичная система счисления.


    Пробелы могут использоваться между любыми лексемами.

    Исключая некоторые детали кодирования, вышеизложенное полностью описывает язык.


    Обозначение объектов JavaScript (JSON) - стандартный текстовый формат для представления структурированных данных на основе синтаксиса объекта JavaScript. Он обычно используется для передачи данных в веб-приложениях (например, отправка некоторых данных с сервера на клиент, поэтому их можно отображать на веб-странице или наоборот). Вы столкнетесь с этим довольно часто, поэтому в этой статье мы даем вам все, что вам нужно для работы с JSON, используя JavaScript, включая разбор JSON, чтобы вы могли получить доступ к данным внутри него и создавать JSON.

    Нет, действительно, что такое JSON?

    Мы собираемся загрузить его на нашу страницу и использовать некоторые изящные манипуляции DOM, чтобы отобразить их, например:

    Получение JSON

    Чтобы получить JSON, мы будем использовать API, называемый XMLHttpRequest (часто называемый XHR ). Это очень полезный объект JavaScript, который позволяет нам делать сетевые запросы для извлечения ресурсов с сервера через JavaScript (например, изображения, текст, JSON, даже фрагменты HTML), что означает, что мы можем обновлять небольшие разделы контента без необходимости перезагрузки всей страницы. Это привело к более отзывчивым веб-страницам и звучит захватывающе, но, к сожалению, выходит за рамки этой статьи, чтобы учить его гораздо более подробно.

  • Начнем с того, что мы собираемся сохранить URL-адрес JSON, который мы хотим получить в переменной. Добавьте нижеследующий код JavaScript: var requestURL = "https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json";
  • Чтобы создать запрос, нам нужно создать новый экземпляр объекта запроса из конструктора XMLHttpRequest , используя ключевое слово new . Добавьте следующую ниже свою последнюю строку: var request = new XMLHttpRequest();
  • Теперь нам нужно открыть новый запрос, используя метод . Добавьте следующую строку: request.open("GET", requestURL);

    Это занимает не менее двух параметров - есть другие доступные параметры. Нам нужен только два обязательных для этого простого примера:

    • Метод HTTP, который следует использовать при выполнении сетевого запроса. В этом случае прекрасен, так как мы просто извлекаем некоторые простые данные.
    • URL-адрес для запроса - это URL-адрес файла JSON, который мы сохранили ранее.
  • Затем добавьте следующие две строки: здесь мы устанавливаем в JSON, так что XHR знает, что сервер будет возвращать JSON и что это должно быть преобразовано за кулисами в объект JavaScript. Затем мы отправляем запрос методом : request.responseType = "json"; request.send();
  • Последний бит этого раздела предполагает ожидание ответа на возврат с сервера, а затем обращение с ним. Добавьте следующий код ниже вашего предыдущего кода: request.onload = function() { var superHeroes = request.response; populateHeader(superHeroes); showHeroes(superHeroes); }
  • Здесь мы сохраняем ответ на наш запрос (доступный в свойстве ) в переменной superHeroes ; эта переменная теперь будет содержать объект JavaScript, основанный на JSON! Затем мы передаем этот объект двум вызовам функций - первый из них заполнит правильными данными, а второй создаст информационную карту для каждого героя в команде и вставляет ее в .

    Мы завернули код в обработчике событий, который запускается, когда событие загрузки запускается в объекте запроса (см. ) - это связано с тем, что событие загрузки запускается, когда ответ успешно возвращается; делая это таким образом, гарантирует, что request.response определенно будет доступен, когда мы приступим, чтобы попытаться что-то с этим сделать.

    Заполнение заголовка

    Теперь мы извлекли данные JSON и превратили его в объект JavaScript, давайте воспользуемся им, написав две функции, на которые мы ссылались выше. Прежде всего, добавьте следующее определение функции ниже предыдущего кода:

    Function populateHeader(jsonObj) { var myH1 = document.createElement("h1"); myH1.textContent = jsonObj["squadName"]; header.appendChild(myH1); var myPara = document.createElement("p"); myPara.textContent = "Hometown: " + jsonObj["homeTown"] + " // Formed: " + jsonObj["formed"]; header.appendChild(myPara); }

    Мы назвали параметр jsonObj , чтобы напомнить себе, что этот объект JavaScript возник из JSON. Здесь мы сначала создаем элемент с , устанавливаем его равным свойству squadName объекта, а затем добавляем его в заголовок с помощью . Затем мы выполняем очень похожую операцию с абзацем: создаем его, устанавливаем его текстовое содержимое и добавляем его в заголовок. Единственное различие заключается в том, что его текст задан как конкатенированная строка, содержащая как homeTown , так и formed свойства объекта.

    Создание информационных карт героя

    Затем добавьте следующую функцию внизу кода, которая создает и отображает карты супергероев:

    Function showHeroes(jsonObj) { var heroes = jsonObj["members"]; for (var i = 0; i < heroes.length; i++) { var myArticle = document.createElement("article"); var myH2 = document.createElement("h2"); var myPara1 = document.createElement("p"); var myPara2 = document.createElement("p"); var myPara3 = document.createElement("p"); var myList = document.createElement("ul"); myH2.textContent = heroes[i].name; myPara1.textContent = "Secret identity: " + heroes[i].secretIdentity; myPara2.textContent = "Age: " + heroes[i].age; myPara3.textContent = "Superpowers:"; var superPowers = heroes[i].powers; for (var j = 0; j < superPowers.length; j++) { var listItem = document.createElement("li"); listItem.textContent = superPowers[j]; myList.appendChild(listItem); } myArticle.appendChild(myH2); myArticle.appendChild(myPara1); myArticle.appendChild(myPara2); myArticle.appendChild(myPara3); myArticle.appendChild(myList); section.appendChild(myArticle); } }

    Для начала сохраним свойство members объекта JavaScript в новой переменной. Этот массив содержит несколько объектов, которые содержат информацию для каждого героя.

    Затем мы используем для циклического прохождения каждого объекта в массиве. Для каждого из них мы:

  • Создаем несколько новых элементов: , , три

    И