Синтаксис json

Работаем со строкой JSON в PHP

PHP, как и JavaScript, имеет встроенные функции для работы с JSON строками.


Создаем строку JSON из переменной PHP

Функция принимает переменную PHP и возвращает строку JSON, представляющую содержание переменной. Вот наш пример с заказом, написанный на PHP:

<?php
$cart = array(
  "orderID" => 12345,
  "shopperName" => "Ваня Иванов",
  "shopperEmail" => "ivanov@example.com",
  "contents" => array(
    array(
      "productID" => 34,
      "productName" => "Супер товар",
      "quantity" => 1
    ),
    array(
      "productID" => 56,
      "productName" => "Чудо товар",
      "quantity" => 3
    )
  ),
  "orderCompleted" => true
);
 
echo json_encode( $cart );
?>

Данный код возвращает абсолютно такую же строку JSON, как и в примере с JavaScript:

{"orderID":12345,"shopperName":"Ваня Иванов","shopperEmail":"ivanov@example.com","contents":,"orderCompleted":true}

В реальном приложении ваш скрипт PHP пришлет данную строку JSON как часть AJAX ответа браузеру, где JavaScript код с помощью метода преобразует ее обратно в переменную для вывода на странице пользователя.

Вы может передавать различные флаги в качестве второго аргумента функции . С их помощью можно изменять принципы кодирования содержания переменных в строку JSON.

Создаем переменную из строки JSON

Для преобразования строки JSON в переменную PHP используется метод . Заменим наш пример для JavaScript с методом на код PHP:

<?php
$jsonString = '
{                                          
  "orderID": 12345,                        
  "shopperName": "Ваня Иванов",             
  "shopperEmail": "ivanov@example.com", 
  "contents": ,                                       
  "orderCompleted": true                   
}                                          
';
 
$cart = json_decode( $jsonString );
echo $cart->shopperEmail . "<br>";
echo $cart->contents->productName . "<br>";
?>

Как и для JavaScript данный код выдаст:

ivanov@example.com
Чудо товар

По умолчанию функция возвращает объекты JSON как объекты PHP. Существуют обобщенные объекты PHP класса . Поэтому мы используем для доступа к свойствам объекта в примере выше.

Если вам нужен объект JSON в виде ассоциированного массива PHP, нужно передать в качестве второго аргумента функции . Например:

$cart = json_decode( $jsonString, true );
echo $cart . "<br>";
echo $cart . "<br>";

Данный код выдаст такой же вывод:

ivanov@example.com
Чудо товар

Также функции можно передавать другие аргументы для указания глубины рекурсии и способов обработки больших целых чисел.

Encoding JSON in PHP (json_encode)

PHP json_encode() function is used for encoding JSON in PHP. This function returns the JSON representation of a value on success or FALSE on failure.

Parameters

  • value − The value being encoded. This function only works with UTF-8 encoded data.

  • options − This optional value is a bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT.

Example


The following example shows how to convert an array into JSON with PHP −

<?php
   $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
   echo json_encode($arr);
?>

While executing, this will produce the following result −

{"a":1,"b":2,"c":3,"d":4,"e":5}

The following example shows how the PHP objects can be converted into JSON −

<?php
   class Emp {
      public $name = "";
      public $hobbies  = "";
      public $birthdate = "";
   }
	
   $e = new Emp();
   $e->name = "sachin";
   $e->hobbies  = "sports";
   $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
   $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));

   echo json_encode($e);
?>

While executing, this will produce the following result −

{"name":"sachin","hobbies":"sports","birthdate":"08\/05\/1974 12:20:03 pm"}

Decoding JSON in PHP (json_decode)

PHP json_decode() function is used for decoding JSON in PHP. This function returns the value decoded from json to appropriate PHP type.

Paramaters

  • json_string − It is an encoded string which must be UTF-8 encoded data.

  • assoc − It is a boolean type parameter, when set to TRUE, returned objects will be converted into associative arrays.

  • depth − It is an integer type parameter which specifies recursion depth

  • options − It is an integer type bitmask of JSON decode, JSON_BIGINT_AS_STRING is supported.

Example

The following example shows how PHP can be used to decode JSON objects −

<?php
   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

   var_dump(json_decode($json));
   var_dump(json_decode($json, true));
?>

While executing, it will produce the following result −

object(stdClass)#1 (5) {
    => int(1)
    => int(2)
    => int(3)
    => int(4)
    => int(5)
}

array(5) {
    => int(1)
    => int(2)
    => int(3)
    => int(4)
    => int(5)
}

Previous Page Print Page

Next Page  

Сравнение с YAML

Как функционально, так и синтаксически JSON является подмножеством языка YAML. В частности, спецификация YAML 1.2 указывает, что «любой файл в формате JSON является корректным файлом в формате YAML». Наиболее распространённый парсер YAML способен обрабатывать и JSON. Спецификация YAML до версии 1.2 не полностью покрывала JSON, в первую очередь из-за отсутствия родной поддержки UTF-32 в YAML, а также требования пробела после разделителя-запятой; кроме того, спецификация JSON включала комментарии в стиле /* */.

Наиболее важным отличием YAML является набор расширений синтаксиса, которым нет аналогов в JSON:

  • поддержка реляционных данных: в YAML-документе можно ссылаться на якорь, встретившийся ранее в файле/потоке; таким образом можно выразить .
  • поддержка расширяемых типов данных помимо примитивов: строк, чисел, логических значений и т. д.
  • поддержка блочного синтаксиса с отступами; он позволяет описать структурированные данные без использования лишних символов: всевозможных скобок, кавычек и т. д.

JSONP и JSONPP

JSONP (англ. JSON Padding — «JSON с подкладкой») является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента.

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

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

{"paper" "A4", "count" 5}

Однако это только данные, и они не могут влиять на браузер.

Используя технику JSONP, стороннему серверу передаётся в строке вызова (GET) имя callback функции:

<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>

Здесь параметр jsonp содержит имя callback функции parseResponse.

Теперь посторонний сервер example.com может вернуть следующий код:

parseResponse({"paper" "A4", "count" 5})

Теперь код вызывает javascript-функцию первого домена.

Поскольку 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")[];
	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;
}

В примере функция создаёт в DOM в части head элемент script, src которого соответствует вызову JSONPP.

После получения ответа от сервера будет вызвана  — она передана в параметрах вызова, как это должно быть по правилам JSONP.

Внутри сработает , и произойдёт возврат значения ans.

Вызов eval(onload) приводит к выполнению с id созданного скрипта в head и в итоге к его удалению, ведь он уже всё равно не будет использоваться, поскольку id в примере было сгенерировано случайным образом в самом начале функции . Этот вызов в ответе сервера.

Простой пример JSON данных

Следующий пример показывает, как можно сохранять данные в «корзине» интернет магазина с помощью JSON формата:

{
  "orderID": 12345,
  "shopperName": "John Smith",
  "shopperEmail": "johnsmith@example.com",
  "contents": ,
  "orderCompleted": true
}

Давайте разберем эти данные по частям:

  1. В начале и конце мы использует фигурные дужки { и }, которые дают понять, что это объект.
  2. Внутри объекта мы имеем несколько пар имя/значение:
  3. «orderID»: 12345 – поле с именем orderId и значение 12345
  4. «shopperName»: «John Smith» – поле с именем shopperName и значение John Smith
  5. «shopperEmail»: «johnsmith@example.com» – подобно, как и в предыдущем поле, здесь храниться email покупателя.
  6. «contents»: – поле с именем content, значение которого массив.
  7. «orderCompleted»: true – поле с именем orderCompleted, значение которого true
  8. Внутри массива contents, мы имеем два объекта, которые отображают содержимое корзины. Каждый объект продукта имеет три свойства: productID, productName, quantity.

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

<script type="text/javascript">
var cart = {
  "orderID": 12345,
  "shopperName": "John Smith",
  "shopperEmail": "johnsmith@example.com",
  "contents": ,
  "orderCompleted": true
};
</script>

Тестирование точек входа REST API

Теперь когда фейковый REST API сервер запущен давайте посмотрим как осуществить запрос, используя HTTP клиент. Для создания запросов к API я воспользуюсь инструментом Postman.

Запросы типа GET


Давайте начнём с создания запроса к REST URL. В созданном нами JSON файле мы определили точку входа под названием users, в которой соответственно хранится информация о пользователях. В результате выполнения запроса к URL http://localhost:3000/users мы должны получить список существующих данных.

Запросы типа POST

Для того чтобы добавить новые данные к уже существующим необходимо совершить POST запрос к URL http://localhost:3000/users. POST запрос должен выглядеть следующим образом:

После повторного выполнения запроса вы должны увидеть новые данные, которые были добавлены в файл .

Запросы типа DELETE

Для удаления данных из , вам необходимо отправить запрос к соответствующей точке входа и передать идентификатор пользователя. К примеру, чтобы удалить пользователя с Id 1, вам необходимо отправить запрос по адресу http://localhost:3000/users/1. Чтобы убедиться что пользователь был удалён выполните GET запрос.

Запрос типа PATCH

Для того чтобы обновить уже существующую запись необходимо отправить запрос с указанием новых значений для уже существующей записи. К примеру, чтобы обновить пользователя с Id 2, отправьте запрос по адресу http://localhost:3000/users/2:

Сравнение JSON с XML

В большинстве случаев, вы будете думать о JSON как альтернативе XML формату – по крайней мере в рамках веб приложений. Концепция Ajax, в оригинале использует XML для обмена данными между сервером и браузером, но в последние годы JSON стал более популярным для передачи ajax данных.

Хотя XML это испытанная и хорошо тестированная технология которой пользуются множество приложений, преимущества JSON формата в том, что он более компактный и более прост в написании и чтении.

Вот вышеописанный JSON пример, только переписанный в XML формате:

<object>
  <property>
    <key>orderID</key>
    <number>12345</number>
  </property>
  <property>
    <key>shopperName</key>
    <string>John Smith</string>
  </property>
  <property>
    <key>shopperEmail</key>
    <string>johnsmith@example.com</string>
  </property>
  <property>
    <key>contents</key>
    <array>
      <object>
        <property>
          <key>productID</key>
          <number>34</number>
        </property>
        <property>
          <key>productName</key>
          <string>SuperWidget</string>
        </property>
        <property>
          <key>quantity</key>
          <number>1</number>
        </property>        
      </object>
      <object>
        <property>
          <key>productID</key>
          <number>56</number>
        </property>
        <property>
          <key>productName</key>
          <string>WonderWidget</string>
        </property>
        <property>
          <key>quantity</key>
          <number>3</number>
        </property> 
      </object>
    </array>
  </property>
  <property>
    <key>orderCompleted</key>
    <boolean>true</boolean>
  </property>  
</object>

Как видите в несколько раз длиннее нежели JSON. По факту, этот пример длинной 1128 символов, в то время, как JSON версия всего лишь 323 символа. Также XML версию сложнее читать.

Естественно, нельзя судить только по одному примеру, но даже небольшие объемы информации занимают меньше места в JSON формате, нежели в XML.

Примечания

  1. (7 февраля 2009).
  2. .
  3.  (англ.) (недоступная ссылка). — Working Draft 2008-05-11. Дата обращения 24 сентября 2009.
  4. . RedHanded (7 апреля 2005). Дата обращения 25 сентября 2012..
  5. Json.Com.  (англ.) (недоступная ссылка).
  6. (27 декабря 2011). Дата обращения 30 декабря 2011.
  7.  (англ.).
  8.  (англ.). Дата обращения 24 сентября 2009.
  9.  (англ.).
  10.  (англ.).
  11.  (англ.) (10 March 2010). Дата обращения 29 марта 2010.
  12.  (англ.).
  13. .
  14. (22 мая 2009). Дата обращения 3 июля 2009.
  15. .
  16. .
  17. (1 сентября 2009). Дата обращения 22 октября 2009.
  18. (7 апреля 2010). Дата обращения 7 апреля 2010.
  19. Джереми Гроссмэн.  (англ.). WhiteHat Security. Дата обращения 23 сентября 2009.
  20. . Bob.pythonmac.org. Дата обращения 8 сентября 2008.
  21. RIAspot.  (недоступная ссылка).

PHP Database

PHP is a server side programming language, and can be used to access a database.

Imagine you have a database on your server, and you want to send a request to it from the client where you ask for the 10 first rows in a table called «customers».

On the client, make a JSON object that describes the numbers of rows you want to return.

Before you send the request to the server, convert the JSON object into a string and send it as a parameter to the url of the PHP page:

Example

Use JSON.stringify() to convert the JavaScript object into JSON:

obj = { «limit»:10 };dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest();xmlhttp.onreadystatechange = function() {   if (this.readyState == 4 && this.status == 200) {    document.getElementById(«demo»).innerHTML = this.responseText;  }};xmlhttp.open(«GET», «json_demo_db.php?x=» + dbParam, true);xmlhttp.send();

Example explained:

  • Define an object containing a «limit» property and value.
  • Convert the object into a JSON string.
  • Send a request to the PHP file, with the JSON string as a parameter.
  • Wait until the request returns with the result (as JSON)
  • Display the result received from the PHP file.

Take a look at the PHP file:

PHP file

<?phpheader(«Content-Type: application/json; charset=utf-8»);$obj = json_decode($_GET, false);$conn = new mysqli(«myServer», «myUser», «myPassword», «Northwind»); $stmt = $conn->prepare(«SELECT name FROM customers LIMIT ?»);$stmt->bind_param(«s», $obj->limit);$stmt->execute();$result = $stmt->get_result(); $outp = $result->fetch_all(MYSQLI_ASSOC);echo json_encode($outp);?>

PHP File explained:

  • Convert the request into an object, using the PHP function json_decode().
  • Access the database, and fill an array with the requested data.
  • Add the array to an object, and return the object as JSON using the json_encode() function.

JS Учебник

JS ГлавнаяJS ВведениеJS УстановкаJS ВыводJS СинтаксисJS ЗаявленияJS КомментарииJS ПеременныеJS ОператорыJS АрифметикаJS ПрисваиванияJS Типы данныхJS ФункцииJS ОбъектыJS ОбластьJS СобытияJS СтрокиJS Методы строкJS ЧислаJS Методы чиселJS МассивыJS Методы массиваJS Сортировка массиваJS Итерация массиваJS ДатыJS Формат датыJS Метод получения датJS Методы набора…JS Математические…JS Случайные числаJS БулевыJS Сравнение…JS Заявления if…elseJS Заявление switchJS Цикл forJS Цикл whileJS Заявление break…JS Преобразование…JS Битовые…JS Регулярные выраженияJS ОшибкиJS ОтладчикJS ПодъемныйJS СтрогийJS Ключевое слово thisJS Руководство стиляJS ПрактикаJS Распространенные ошибкиJS ЭффективностьJS Зарезервированные словаJS ВерсииJS Версия ES5JS Версия ES6JS JSON

Синтаксис

JSON-текст представляет собой (в закодированном виде) одну из двух структур:

  • Набор пар ключ: значение. В различных языках это реализовано как запись, структура, словарь, хеш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка (регистрозависимость не регулируется стандартом, это остаётся на усмотрение программного обеспечения. Как правило, регистр учитывается программами — имена с буквами в разных регистрах считаются разными, например), значением — любая форма. Повторяющиеся имена ключей допустимы, но не рекомендуются стандартом; обработка таких ситуаций происходит на усмотрение программного обеспечения, возможные варианты — учитывать только первый такой ключ, учитывать только последний такой ключ, генерировать ошибку.
  • Упорядоченный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.

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

В качестве значений в JSON могут быть использованы:

  • запись — это неупорядоченное множество пар ключ:значение, заключённое в фигурные скобки «{ }». Ключ описывается строкой, между ним и значением стоит символ «:». Пары ключ-значение отделяются друг от друга запятыми.
  • массив (одномерный) — это упорядоченное множество значений. Массив заключается в квадратные скобки «». Значения разделяются запятыми. Массив может быть пустым, т.е. не содержать ни одного значения. Значения в пределах одного массива могут иметь разный тип.
  • число (целое или вещественное).
  • литералы true (логическое значение «истина»), false (логическое значение «ложь») и null.
  • строка — это упорядоченное множество из нуля или более символов юникода, заключённое в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты «\» (поддерживаются варианты \’, \», \\, \/, \t, \n, \r, \f и \b), или записаны шестнадцатеричным кодом в кодировке Unicode в виде \uFFFF.

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

Следующий пример показывает JSON-представление данных об объекте, описывающем человека. В данных присутствуют строковые поля имени и фамилии, информация об адресе и массив, содержащий список телефонов. Как видно из примера, значение может представлять собой вложенную структуру.

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

Обратите внимание на пару. В качестве значений в JSON могут быть использованы как число, так и строка

Поэтому запись содержит строку, а — уже числовое значение. Из-за слабой типизации в Javascript и PHP число (наверное имеется в виду строка) может быть приведено к числу и не влиять на логику программы. Тем не менее, рекомендуется аккуратно обращаться с типом значения, так как JSON служит для межсистемного обмена.

На языке 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>

или так:

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

Для каких целей используется JSON?

Более всего, json используется для обмена данными между javascript и серверной стороной (php). Другими словами, для технологии ajax. Это очень удобно, когда вы передаете несколько переменных или целые массивы данных.

Как это выглядит на примере:

  1. Пользователь кликает по превьюшке картинки
  2. JavaScript обрабатывает это событие и посылает ajax запрос к PHP скрипту, передавая ID картинки.
  3. На сервере, php получает описание картинки, имя картинки, адрес к большому изображению и другую информацию из базы данных. Получив, преобразовывает в JSON формат и отправляет обратно на страницу пользователя.
  4. JavaScript получает ответ в виде JSON, обрабатывает данные, формирует html код и выводит увеличенное изображение с описанием и другой информацией.

Так происходит увеличение картинки, без перезагрузки страницы в браузере. Это очень удобно, когда нам необходимо получить частичные данные, или передать небольшой объем информации на сервер.

Всеми любимый jQuery, имеет функции getJSON() и parseJSON(), которые помогают работать с форматом через ajax запросы.

Вопросы безопасности

Хотя JSON предназначен для передачи данных в сериализованном виде, его синтаксис соответствует синтаксису JavaScript и это создаёт ряд проблем безопасности. Зачастую для обработки данных, полученных от внешнего источника в формате JSON, к ним применяется функция без какой-либо предварительной проверки.

JavaScript

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

Техника использования делает систему уязвимой, если источник используемых JSON-данных не является доверенным (англ.). В качестве таких данных может выступать вредоносный JavaScript код для атак класса Внедрение кода (англ.). С помощью данной уязвимости возможно осуществлять кражу данных, подделку аутентификации. Тем не менее, уязвимость можно устранить за счёт использования дополнительных средств проверки данных на корректность. Например, до выполнения полученные от внешнего источника данные могут проверяться с помощью регулярных выражений. В RFC, определяющей JSON, предлагается использовать следующий код для проверки его соответствия формату JSON

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

Как более безопасная альтернатива была предложена новая функция , способная обрабатывать только JSON-данные. Она была представлена в четвёртой версии стандарта ECMAScript и описана в статье «JSON: Обезжиренная альтернатива XML». В настоящее время она доступна как библиотека JavaScript и была включена в пятую редакцию ECMAScript.

Встроенный JSON

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

  • Mozilla Firefox 3.5+
  • Microsoft Internet Explorer 8
  • Opera 10.5+
  • Браузеры, основанные на WebKit (например, Google Chrome и Apple Safari)

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

  • jQuery
  • Dojo
  • MooTools
  • Yahoo! UI Library
  • Prototype

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

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

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

PHP Method = POST

When sending data to the server, it is often best to use the HTTP method.

To send AJAX requests using the method, specify the method, and the correct header.


The data sent to the server must now be an argument to the method:

Example

obj = { «limit»:10 };dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest();xmlhttp.onreadystatechange = function() {  if (this.readyState == 4 && this.status == 200) {    myObj = JSON.parse(this.responseText);    for (x in myObj) {      txt += myObj.name + «<br>»;     }    document.getElementById(«demo»).innerHTML = txt;   }};xmlhttp.open(«POST», «json_demo_db_post.php», true); xmlhttp.setRequestHeader(«Content-type», «application/x-www-form-urlencoded»);xmlhttp.send(«x=» + dbParam);

The only difference in the PHP file is the method for getting the transferred data.

PHP file

Use $_POST instead of $_GET:

<?phpheader(«Content-Type: application/json; charset=utf-8»);$obj = json_decode($_POST, false); $conn = new mysqli(«myServer», «myUser», «myPassword», «Northwind»); $stmt = $conn->prepare(«SELECT name FROM customers LIMIT ?»);$stmt->bind_param(«s», $obj->limit);$stmt->execute();$result = $stmt->get_result(); $outp = $result->fetch_all(MYSQLI_ASSOC);echo json_encode($outp);?>

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

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

var http_request = new XMLHttpRequest();
http_request.onreadystatechange = function () {
    if (http_request.readyState !== 4)
        return;
        
    if (http_request.status !== 200)
        throw new Error('request was defeated');
        
    do_something_with_object(JSON.parse(http_request.responseText));
    http_request = null;
};
http_request.open("GET", url, true);
http_request.send(null);

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

Как вариант, в коде страницы можно использовать элементы для асинхронного запроса JSON-данных, или просто . Эти подходы были распространены до появления широкой поддержки XMLHttpRequest.

Отправляем данные на сервер

Обыч­но, что­бы отпра­вить дан­ные на сер­вер, нуж­но делать запрос. Вы нажи­ма­е­те кноп­ку на стра­ни­це, бра­у­зер ухо­дит думать, ждёт отве­та сер­ве­ра и рису­ет вам новую стра­ни­цу в соот­вет­ствии с этим отве­том. Гру­бо гово­ря, запрос на сер­вер застав­ля­ет вашу стра­ни­цу пере­за­гру­жать­ся.

К сча­стью, инже­не­ры дав­но при­ду­ма­ли, как отправ­лять дан­ные на сер­вер, не пере­за­гру­жая стра­ни­цу. Для это­го исполь­зу­ют JavaScript.

Что­бы отпра­вить запрос, нам пона­до­бит­ся встро­ен­ный объ­ект XMLHttpRequest(). Вот как мы вво­дим его в повест­во­ва­ние:

// создаём новый экземпляр запроса XHRlet xhr = new XMLHttpRequest();

Для запро­са нам нуж­но знать адрес, куда будем отправ­лять наш JSON — это и есть адрес наше­го скрип­та, кото­рый мы напи­шем поз­же. Мы будем писать его на PHP, поэто­му зара­нее можем при­ду­мать ему имя и адрес, где он будет лежать: http://mihailmaximov.ru/projects/json/json.php.

// адрес, куда мы отправим нашу JSON-строкуurl = «http://mihailmaximov.ru/projects/json/json.php»;

Когда мы зна­ем адрес, мы можем открыть соеди­не­ние, что­бы сер­вер был готов при­нять наши дан­ные. Это зна­чит, что мы пока ниче­го цен­но­го туда не посы­ла­ем, а про­сто пре­ду­пре­жда­ем сер­вер, что ско­ро что-то при­ле­тит:

// открываем соединение. url — это переменная с нашим адресомxhr.open(«POST», url, true);

Теперь напи­шем заго­ло­вок запро­са, что­бы сер­вер пони­мал, какие дан­ные мы ему при­шлём и как ему их обра­ба­ты­вать. Так как у нас JSON, то это и про­пи­шем в заго­лов­ке:

 // устанавливаем заголовок — выбираем тип контента, который отправится на сервер, в нашем случае мы явно пишем, что это JSONsetRequestHeader(«Content-Type», «application/json»);

Чуть ниже сра­зу про­пи­шем пове­де­ние скрип­та на слу­чай отве­та сер­ве­ра. Сер­вер дол­жен обра­бо­тать наши дан­ные, вер­нуть ответ, а мы долж­ны этот ответ пой­мать и выве­сти на стра­ни­цу:

Послед­нее, что нам оста­лось сде­лать, — выта­щить наши вве­дён­ные дан­ные из полей, собрать из них JSON и отпра­вить на сер­вер:

 // преобразуем наши данные JSON в строку      var data = JSON.stringify({ «name»: name.value, «lastname»: lastname.value });      // когда всё готово, отправляем JSON на сервер      xhr.send(data); Готовый скрипт на странице


С этим читают