ООП   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 - визуальные среды

Знаете ли Вы, что такое мысленный эксперимент, gedanken experiment?
Это несуществующая практика, потусторонний опыт, воображение того, чего нет на самом деле. Мысленные эксперименты подобны снам наяву. Они рождают чудовищ. В отличие от физического эксперимента, который является опытной проверкой гипотез, "мысленный эксперимент" фокуснически подменяет экспериментальную проверку желаемыми, не проверенными на практике выводами, манипулируя логикообразными построениями, реально нарушающими саму логику путем использования недоказанных посылок в качестве доказанных, то есть путем подмены. Таким образом, основной задачей заявителей "мысленных экспериментов" является обман слушателя или читателя путем замены настоящего физического эксперимента его "куклой" - фиктивными рассуждениями под честное слово без самой физической проверки.
Заполнение физики воображаемыми, "мысленными экспериментами" привело к возникновению абсурдной сюрреалистической, спутанно-запутанной картины мира. Настоящий исследователь должен отличать такие "фантики" от настоящих ценностей.

Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").

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

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 21.09.2019 - 11:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Галины Царёвой - Карим_Хайдаров.
21.09.2019 - 11:36: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
20.09.2019 - 19:50: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
20.09.2019 - 04:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
18.09.2019 - 12:08: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> ПРОБЛЕМА ИСКУССТВЕННОГО ИНТЕЛЛЕКТА - Карим_Хайдаров.
18.09.2019 - 06:01: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Л.Г. Ивашова - Карим_Хайдаров.
17.09.2019 - 05:51: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ФАЛЬСИФИКАЦИЯ ИСТОРИИ - Карим_Хайдаров.
17.09.2019 - 05:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Тиртхи - Карим_Хайдаров.
16.09.2019 - 03:11: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
14.09.2019 - 18:23: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
13.09.2019 - 09:08: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
12.09.2019 - 17:47: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
Bourabai Research Institution home page

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