ООП   PHP   web   4GL - визуальные среды

Технология JSON

  1. Функция JavaScript для работы с JSON
  2. Функции PHP для работы с JSON

JSON – это языконезависимый текстовый формат обмена данными. Обычно используется при обмене данными между браузером и сервером. Формат JSON (JavaScript Object Notation), представляет собой JavaScript объект и является простой текстовой строкой.

Чтобы проще было понять, что такое JSON, немного расскажу о том, как создать объект в JavaScript. Существует два способа создания одного и того же объекта. Для наглядности давайте создадим объект описывающий продукцию интернет магазина.

Первый способ

Определение объекта каталога для магазина в JavaScript может выглядеть таким образом:

<script>
var Item = new Object();
Item.Name = "Футболка";
Item.Description = "Цветная футболка разных размеров"
Item.price = 1500;
Item.Availability = false;
</script>

Второй способ

Создать тот же объект можно с помощью литеральной нотации:

 var Item ={
 "Name":"Футболка",
 "Description":"Цветная футболка разных размеров",
 "price":"1500",
 "Availability": false
}

Внимание! Литеральная аннотация, по сути, и является форматом JSON.

Другими словами если на запрос браузера в ответе сервера мы передадим текст:

{
 "Name":"Футболка",
 "Description":"Цветная футболка разных размеров",
 "price":"1500",
 "Availability": false
}

И этот текст будет обработан в JavaScript соответствующей функцией для работы с форматом JSON, то мы получим тот самый объект.

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

Чтобы преобразовать полученную строку из ответа сервера в реальный объект с полями и методами, текст нужно пропустить через специальную функцию eval().

Функция eval() предназначена для выполнения JavaScript кода переданного ей в виде текста.

<script>
code = "alert('Привет мир!')";
eval(code);
</script>

В результате выполнения этого скрипта мы увидим сообщение “Привет мир!”:

Результат работы eval()

Вернемся к нашему формату JSON. Принятую строку sData передадим в eval(), и выведем в сообщении весь список полей объекта.

<script>
var sData='{ "Name":"Футболка","Description":"Цветная футболка разных размеров","price":"1500","Availability": false}';
var Item = eval("(" + sData + ")");
text = "Продукт:"+"\n-"+Item.Name+"\n-"+Item.Description+"\n-"+Item.price+"\n-"+Item.Availability+"\n";  
alert(text);
</script>

В результате получим:

Интерпритация JSON нотации

Обратите вниание на форму передачи текста в eval():

eval("(" + sData + ")");

Для корректной интерпретации JSON объекта нужно обрамить текст круглыми скобками. Либо присвоить литеральную нотацию объекту:

var Item = eval("obj = " + sData);

В этом случае, сначала создастcя объект obj , а замет объект Item с полями с методами объекта obj.

С помощью формата JSON с сервера можно передавать такие данные как:

  1. запись,
  2. структура,
  3. хэш-таблица,
  4. список,
  5. ассоциативный массив.

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

В концепцию JSON заложены такие понятия как:

Объект — множество пар имя:значение, в фигурных скобках { }, разделяемых двоеточием.

Пример объекта:

{
 "Продукция": "Майка", 
 "Стоимость": 1500,
 "Описание": "Цветная майка разных размеров"
}

Массив — множество индексированных значений заключенных в квадратные скобки.

Пример массива:

{
"Описание":
  {
   "Размер":["S","M","L","XL"],   
   "Цвет"  :["Красный","Зеленый","Синий"]
  }
}

Значение – число, строка, булевы значения true, false, null.

Пример использования различных значений:

{
  "Продукция": "Майка", 
  "Стоимость": 1500,      
   "Наличие на складе": false,
   "Описание": {
         "Размер":["S","M","L","XL"], 
         "Цвет"  :["Красный","Зеленый","Синий"]
                }
}

Вот еще пример интерпретации сложного JSON объекта с вложенными массивами:

<script>
var sData='{ "Продукция": "Майка",  "Стоимость": 1500,  "Наличие на складе": false, 
"Описание": {"Размер":["S","M","L","XL"],"Цвет" :["Красный","Зеленый","Синий"]}}';
    
var Item = eval("obj = " + sData);
    text = "Продукт:"
    +"\n-"+Item['Продукция']   
    +"\n-"+Item['Стоимость']   
    +"\n-"+Item['Наличие на складе'] 
    +"\n-"+Item['Описание']['Размер'][1]  
    +"\n-"+Item['Описание']['Цвет'][1]
alert(text);
</script>

Результат:

Объект из формата JSON

Как видите мы вытащили из объекта информацию хранившуюся во вложенных массивах:

Item['Описание']['Размер'][1]
Item['Описание']['Цвет'][1]

Думаю со стороной клиента все понятно: получаем строку, преобразовываем в объект и работаем с ней дальше. Как же быть со стороной сервера, не вручную ведь нам формировать JSON объекты…

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

Хвала разработчикам PHP, всю сложную работу они сделали за нас. Нам не придется самостоятельно писать парсеры PHP объектов, массивов и других структур. Если мы хотим получить массив в JSON формате, нам нужно только использовать встроенные готовые php функции: json_encode() и json_decode().

К примеру, мы имеем php скрипт оперирующий все тем же объектом каталога для интернет магазина.

class Product{
    public $name;
    public $price;
    public $description;

     
    function Product(){
        $this->name = "Футболка";
        $this->price = 1500;        
        $this->description= array(
            "size"=>array("S","M","L","XL"),
            "color"=>array("Красный","Зеленый","Синий")
        );
    }
}

$Item = new Product();
echo "<br/>".$Item->name;
echo "<br/>".$Item->price;
echo "<br/>".$Item->description['size'][1];
echo "<br/>".$Item->description['color'][1];

Теперь представим, что мы хотим передать наш созданный объект в формате JSON, для дальнейшего использования на стороне клиента. Все, что потребуется сделать это всего лишь передать в json_encode() экземпляр класса.

$send_json=json_encode($Item);

В результате выполнения такой строчки кода в переменную $send_json будет записана такая информация:

{"name":"\u0424\u0443\u0442\u0431\u043e\u043b\u043a\u0430",
"price":1500,"description":{"size":["S","M","L","XL"],
"color":["\u041a\u0440\u0430\u0441\u043d\u044b\u0439",
"\u0417\u0435\u043b\u0435\u043d\u044b\u0439","\u0421\u0438\u043d\u0438\u0439"]}}

Этот страшный на первый взгляд набор символов, является сериализованным видом нашего объекта $Item. Так как в полях объекта используются кирилические символы, то функция заменяет их на ASCII коды, увеличивая при этом объем передаваемой информации. ( Подробнее об особенностях кодировок можно проитать в статье: PHP Кодировка страницы)

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

<script>
var sData='{"name":"\u0424\u0443\u0442\u0431\u043e\u043b\u043a\u0430",
"price":1500,"description":{"size":["S","M","L","XL"],
"color":["\u041a\u0440\u0430\u0441\u043d\u044b\u0439",
"\u0417\u0435\u043b\u0435\u043d\u044b\u0439","\u0421\u0438\u043d\u0438\u0439"]}}';
    
var Item = eval("obj = " + sData);
    text = "Продукт:"
    +"\n-"+Item['name']
    +"\n-"+Item['description']['size'][0];

alert(text);
</script>

Как мы можем видеть, клон объекта из PHP доступен теперь в JavaScript:

JSON форматирование работает

Теперь попробуем десериализовать полученные данные обратно с помощью json_decode().

Допустим мы в PHP скрипте получаем строку в формате JSON содержащую информацию об объекте:

<?php
$json='{"name":"\u0424\u0443\u0442\u0431\u043e\u043b\u043a\u0430",
"price":1500,"description":{"size":["S","M","L","XL"],
"color":["\u041a\u0440\u0430\u0441\u043d\u044b\u0439",
"\u0417\u0435\u043b\u0435\u043d\u044b\u0439","\u0421\u0438\u043d\u0438\u0439"]}}';
$Item = json_decode($json, true);

echo "<br/>".$Item['name'];
echo "<br/>".$Item['price'];
echo "<br/>".$Item['description']['size'][1];
echo "<br/>".$Item['description']['color'][1];
?>

Используем json_decode( ) для десериализации полученных данных, и записываем все это в переменную $Item. Таким образом, мы получили полноценный экземпляр класса Product .

Обратите внимание в коде вторым параметров в функцию передано значение ture

json_decode($json,true);

Это сделанно для того, чтобы избежать ошибки:

Cannot use object of type stdClass

Дело в том, что у нас в примере используются вложенные массивы для поля ‘description’, а без параметра true , функция json_decode() интерпретирует такие поля как stdClass, в следствии чего , потом к ним невозможно обратиться.

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

function json_encode_cyr($str) {
$arr_replace_utf = array('\u0410', '\u0430','\u0411','\u0431','\u0412','\u0432',
'\u0413','\u0433','\u0414','\u0434','\u0415','\u0435','\u0401','\u0451','\u0416',
'\u0436','\u0417','\u0437','\u0418','\u0438','\u0419','\u0439','\u041a','\u043a',
'\u041b','\u043b','\u041c','\u043c','\u041d','\u043d','\u041e','\u043e','\u041f',
'\u043f','\u0420','\u0440','\u0421','\u0441','\u0422','\u0442','\u0423','\u0443',
'\u0424','\u0444','\u0425','\u0445','\u0426','\u0446','\u0427','\u0447','\u0428',
'\u0448','\u0429','\u0449','\u042a','\u044a','\u042d','\u044b','\u042c','\u044c',
'\u042d','\u044d','\u042e','\u044e','\u042f','\u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$str1 = json_encode($str);
$str2 = str_replace($arr_replace_utf,$arr_replace_cyr,$str1);
return $str2;
}
ООП   PHP   web   4GL - визуальные среды

Знаете ли Вы, что, когда некоторые исследователи, пытающиеся примирить релятивизм и эфирную физику, говорят, например, о том, что космос состоит на 70% из "физического вакуума", а на 30% - из вещества и поля, то они впадают в фундаментальное логическое противоречие. Это противоречие заключается в следующем.

Вещество и поле не есть что-то отдельное от эфира, также как и человеческое тело не есть что-то отдельное от атомов и молекул его составляющих. Оно и есть эти атомы и молекулы, собранные в определенном порядке. Также и вещество не есть что-то отдельное от элементарных частиц, а оно состоит из них как базовой материи. Также и элементарные частицы состоят из частиц эфира как базовой материи нижнего уровня. Таким образом, всё, что есть во вселенной - это есть эфир. Эфира 100%. Из него состоят элементарные частицы, а из них всё остальное. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 23.02.2020 - 19:17: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
23.02.2020 - 19:14: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
23.02.2020 - 19:10: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
22.02.2020 - 07:52: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Ю.Ю. Болдырева - Карим_Хайдаров.
19.02.2020 - 18:24: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Фурсова - Карим_Хайдаров.
17.02.2020 - 19:50: ЭКСПЕРИМЕНТАЛЬНАЯ ФИЗИКА - Experimental Physics -> Эксперименты Сёрла и его последователей с магнитами - Карим_Хайдаров.
17.02.2020 - 19:49: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Тиртхи - Карим_Хайдаров.
17.02.2020 - 19:13: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> КОЛЛАПС МИРОВОЙ ФИНАНСОВОЙ СИСТЕМЫ - Карим_Хайдаров.
17.02.2020 - 19:09: ЭКСПЕРИМЕНТАЛЬНАЯ ФИЗИКА - Experimental Physics -> Вихревые эффекты и вихревые теплогенераторы - Карим_Хайдаров.
17.02.2020 - 19:06: ЭКСПЕРИМЕНТАЛЬНАЯ ФИЗИКА - Experimental Physics -> Эксперименты Андрея Петровича Хрищановича - Карим_Хайдаров.
17.02.2020 - 18:48: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> КОМПЬЮТЕРНО-СЕТЕВАЯ БЕЗОПАСНОСТЬ ДЛЯ ВСЕХ - Карим_Хайдаров.
17.02.2020 - 18:47: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ЗА НАМИ БЛЮДЯТ - Карим_Хайдаров.
Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution