Json квадратни скоби. Въведение в JSON

В тази статия искам да говоря за формата за обмен на текстови данни - JSON, и по-специално за работата с този формат в PHP.

JSON е компактен формат на текстови данни. Може да се използва както в услуги за предаване на данни по Интернет, така и за съхраняване на информация в структуриран вид.

JSON( Английски JavaScript обектна нотация) е текстов формат за обмен на данни, базиран на JavaScript и често използван с този език. Подобно на много други текстови формати, JSON е лесен за четене от хората.

Въпреки произхода си от JavaScript (по-точно от подгрупа на езика на стандарта ECMA-262 от 1999 г.), форматът се счита за независим от езика и може да се използва с почти всеки език за програмиране. За много езици има готов код за създаване и обработка на данни във формат JSON.

Практическите ползи от използването на JSON се разкриват при използването на технологията AJAX. Форматът JSON е по-сбит и четим от XML и е естествен за Javascript. Освен това е възможно да се вмъкнат напълно функционални функции в JSON кода.

Да, именно в AJAX технологията според мен е основното й приложение. Тъй като технологията AJAX включва изпращане на клиентска заявка до сървъра. След това заявката се обработва на сървъра и резултатът се изпраща в отговор на клиента.

Тип данни във формат JSON

JSON поддържа всички основни формати на данни: низове, числа, булеви стойности, както и масиви и обекти (комбинации ключ:стойност, разделени със запетаи и оградени във фигурни скоби).

Ето пример за представяне на данни във формат JSON:

("id":"1","name":"ivan","country":"Русия","office":["yandex","management"])

Нека да разгледаме какво може да предаде този ред: човек с име „иван“, под идентификатор „1“, живеещ в страната „Русия“, работи в компанията „yandex“ в отдел „мениджмънт“.

Нека дадем друг пример. Сайтът разполага с форма за обратна връзка, използваща технологията AJAX. Посетителят попълва информацията, след което тя се изпраща на сървъра за проверка; ако не бъдат открити грешки, информацията се записва в базата данни и се изпраща отговор, показващ успешно запазване. Но ако се открият грешки, се връща отговор с типове грешки.

Примерен отговор за грешка във формат JSON:

("error":"1","errorcode":["empty_pers","empty_mail","empty_phone","empty_letter","empty_scode"])

Което например означава:

  • Трябва да попълните полето „Лице за контакт“.
  • Трябва да попълните полето „Имейл“.
  • Трябва да попълните полето "Телефон".
  • Въведете текст на съобщението
  • Трябва да попълните полето "Номер на снимката".

Ако няма грешки, отговорът се връща:

("грешка":"0")

Което показва успешното изпращане на данни.

В PHP разширението JSON се използва за представяне на данни във формат JSON. Във версии на PHP, по-стари от 5.2.0, поддръжката на JSON е вградена в ядрото; в по-ранните версии трябва да включите допълнителен файл с функции във вашия скрипт.

Така че в PHP две функции са отговорни за работата с данни във формат JSON: json_encode() и json_decode().

Конвертиране на данни във формат JSON $json_data = array ("id"=>1,"name"=>"ivan","country"=>"Russia","office"=>array("yandex","management") ); ехо json_encode($json_data); Обратно преобразуване на данни от JSON формат $json_string="("id":1,"name":"ivan","country":"Russia","office":["yandex","management"]) "; $obj=json_decode($json_string);

Сега $obj ще съдържа JSON данни, преведени в PHP обект, до който можете да получите достъп, както следва:

Echo $obj->name; //Показва името ivan echo $obj->office; //Показване на компанията yandex

Както можете да видите, $obj->office е масив.

Foreach($obj->office as $val) ехо $val;

Работата с JSON ви позволява да обменяте данни със сървъра в "чиста форма". Няма нужда да изпращате обемисти части от HTML код.

Със сигурност някога сте чували за JSON. Какво е? Какво може да прави и как да го използвам?

В този урок ще разгледаме основите на JSON и ще разгледаме следните точки:

  • Какво е JSON?
  • За какво се използва JSON?
  • Как да създадете JSON низ?
  • Прост пример за JSON низ.
  • Нека сравним JSON и XML.
  • Как да работим с JSON в JavaScript и PHP?
Какво е JSON?

JSON е прост, базиран на текст начин за съхраняване и предаване на структурирани данни. С прост синтаксис можете лесно да съхранявате всичко от едно число до низове, масиви и обекти в обикновен текст. Можете също да свържете масиви и обекти заедно, за да създадете сложни структури от данни.

След като JSON низът е създаден, е лесно да го изпратите до друго приложение или до друго място в мрежата, защото е обикновен текст.

JSON има следните предимства:

  • Компактен е.
  • Изреченията му са лесни за четене и съставяне както от хора, така и от компютри.
  • Може лесно да се преобразува в структура от данни за повечето езици за програмиране (числа, низове, булеви стойности, масиви и др.)
  • Много езици за програмиране имат функции и библиотеки за четене и създаване на JSON структури.

Името JSON означава JavaScript Object Notation. Както подсказва името, той се основава на начин за дефиниране на обекти (подобно на създаването на асоциативни масиви в други езици) и масиви.

За какво се използва JSON?

Най-често срещаната употреба на JSON е да изпраща данни от сървъра към браузъра. Обикновено JSON данните се доставят с помощта на AJAX, което позволява на браузъра и сървъра да комуникират, без да се налага презареждане на страницата.

  • Потребителят кликва върху миниатюра на продукт в онлайн магазин.
  • JavaScript, работещ в браузъра, генерира AJAX заявка към PHP скрипта, работещ на сървъра, като предава идентификатора на избрания продукт.
  • PHP скриптът получава името на продукта, описанието, цената и друга информация от базата данни. След това съставя JSON низ от данните и го изпраща на браузъра.
  • JavaScript, работещ в браузъра, получава JSON низа, декодира го и показва информацията за продукта на страницата за потребителя.
  • Можете също да използвате JSON, за да изпращате данни от браузъра към сървъра, като предавате JSON низ като параметър към GET или POST заявки. Но този метод е по-рядко срещан, тъй като прехвърлянето на данни чрез AJAX заявки може да бъде опростено. Например идентификаторът на продукта може да бъде включен в URL адреса като част от GET заявка.

    Библиотеката jQuery има няколко метода, като getJSON() и parseJSON(), които улесняват извличането на данни с помощта на JSON чрез AJAX заявки.

    Как да създадете JSON низ?

    Има няколко основни правила за създаване на JSON низ:

    • JSON низът съдържа или масив от стойности, или обект (асоциативен масив от двойки име/стойност).
    • Масиве оградено в квадратни скоби ([ и ]) и съдържа разделен със запетаи списък със стойности.
    • Предмете оградено във фигурни скоби (( и )) и съдържа разделен със запетаи списък на двойки име/стойност.
    • двойка име/стойностсе състои от името на полето, оградено в двойни кавички, последвано от двоеточие (:) и стойността на полето.
    • Значениев масив или обект може да има:
      • Число (цяло число или с плаваща запетая)
      • Низ (в двойни кавички)
      • Булева стойност (истина или невярно)
      • Друг масив (ограден в квадратни скоби)
      • Друг обект (ограден във фигурни скоби)
      • нулева стойност

    За да включите двойни кавички в низ, трябва да използвате обратна наклонена черта: \" . Както при много езици за програмиране, можете да поставите контролни знаци и шестнадесетични кодове в низ, като поставите пред тях обратна наклонена черта. Вижте уебсайта на JSON за подробности.

    Прост пример за JSON низ

    По-долу е даден пример за поръчка във формат JSON:

    ( "orderID": 12345, "shopperName": "Ваня Иванов", "shopperEmail": " [имейл защитен]", "contents": [ ( "productID": 34, "productName": "Супер продукт", "quantity": 1 ), ( "productID": 56, "productName": "Чудотворен продукт", "quantity": 3 ) ], "orderCompleted": true )

    Нека разгледаме линията в детайли:

    • Създаваме обект с помощта на фигурни скоби (( и )).
    • Обектът има няколко двойки име/стойност: "orderID": 12345 Свойство с име "orderId" и целочислена стойност 12345 "shopperName": "Vanya Ivanov" свойство с име "shopperName" и стойността на низа "Vanya Ivanov" " "shopperEmail": " [имейл защитен]" Свойство с име "shopperEmail" със стойност на низ " [имейл защитен]" "contents": [ ... ] Свойство с име "contents", чиято стойност е масив "orderCompleted": true Свойство с име "orderCompleted" и булевата стойност true
    • Има 2 обекта в масива "съдържание", представляващи отделни елементи в поръчката. Всеки обект съдържа 3 свойства: productID, productName и quantity.

    Между другото, тъй като JSON се основава на деклариране на JavaScript обекти, можете бързо и лесно да направите горния JSON низ JavaScript обект:

    var cart = ( "orderID": 12345, "shopperName": "Ваня Иванов", "shopperEmail": " [имейл защитен]", "contents": [ ( "productID": 34, "productName": "Супер продукт", "quantity": 1 ), ( "productID": 56, "productName": "Чудотворен продукт", "quantity": 3 ) ], "orderCompleted": true );

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

    По много начини можете да мислите за JSON като алтернатива на XML, поне в пространството на уеб приложенията. Концепцията на AJAX първоначално се основава на използването на XML за прехвърляне на данни между сървъра и браузъра. Но през последните години JSON става все по-популярен за транспортиране на AJAX данни.

    Докато XML е доказана технология, която се използва в голям брой приложения, JSON има предимството да бъде по-компактен и по-лесен за разпознаване формат на данни.

    Ето как би изглеждал горният примерен обект в XML:

    orderID 12345 shopperName Ваня Иванов shopperEmail [имейл защитен]съдържание productID 34 productName Супер продукт количество 1 productID 56 productName Miracle продукт количество 3 orderCompleted true

    XML версията е значително по-голяма. В действителност той е дълъг 1128 знака, докато JSON версията е само 323 знака. XML версията също е доста трудна за разбиране.

    Разбира се, това е радикален пример. И е възможно да се създаде по-компактен XML запис. Но дори и той ще бъде значително по-дълъг от еквивалента на JSON.

    Работа с JSON низ в JavaScript

    JSON има прост формат, но ръчното създаване на JSON низ е доста досадно. Освен това често трябва да вземете JSON низ, да конвертирате съдържанието му в променлива, която може да се използва в кода.

    Повечето езици за програмиране имат инструменти за лесно конвертиране на променливи в JSON низове и обратно.

    Създаване на JSON низ от променлива

    JavaScript има вграден метод JSON.stringify(), който приема променлива и връща JSON низ, представящ нейното съдържание. Например, нека създадем JavaScript обект, който съдържа информацията за поръчката от нашия пример, и след това да създадем JSON низ от него:

    var cart = ( "orderID": 12345, "shopperName": "Ваня Иванов", "shopperEmail": " [имейл защитен]", "contents": [ ( "productID": 34, "productName": "Супер продукт", "quantity": 1 ), ( "productID": 56, "productName": "Чудотворен продукт", "quantity": 3 ) ], "orderCompleted": true ); предупреждение (JSON.stringify(cart));

    Този код ще произведе:

    Имайте предвид, че методът JSON.stringify() връща JSON низ без интервали. По-труден е за четене, но е по-компактен за предаване по мрежата.

    Има няколко начина за анализиране на JSON низ в JavaScript, но най-безопасният и надежден е използването на вградения метод JSON.parse(). Той получава JSON низ и връща JavaScript обект или масив, който съдържа данните. Например:

    var jsonString = " \ ( \ "orderID": 12345, \ "shopperName": "Ваня Иванов", \ "shopperEmail": " [имейл защитен]", \ "съдържание": [ \ ( \ "productID": 34, \ "productName": "Супер продукт", \ "количество": 1 \), \ ( \ "productID": 56, \ "productName": "Чудодейни стоки", \"количество": 3\ ) \ ], \"orderCompleted": true \ ) \"; var cart = JSON.parse(jsonString); предупреждение (cart.shopperEmail); предупреждение(cart.contents.productName);

    Създадохме променлива jsonString, която съдържа JSON низа от нашата примерна поръчка. След това предаваме този низ на метода JSON.parse(), който създава обект, съдържащ JSON данните и го съхранява в променливата cart. Всичко, което остава, е да проверите чрез показване на свойствата на обекта shopperEmail и productName на масива contents.

    В резултат на това ще получим следния резултат:

    В реално приложение вашият JavaScript код ще получи поръчката като JSON низ в AJAX отговор от сървърния скрипт, ще предаде низа на метода JSON.parse() и след това ще използва данните, за да го покаже на страницата на потребителя.

    JSON.stringify() и JSON.parse() имат други възможности, като например използване на функции за обратно извикване за потребителско конвертиране на определени данни. Такива опции са много полезни за конвертиране на различни данни в правилни JavaScript обекти.

    Работа с JSON низ в PHP

    PHP, подобно на JavaScript, има вградени функции за работа с JSON низове.

    Създаване на JSON низ от PHP променлива

    Функцията json_encode() приема PHP променлива и връща JSON низ, представящ съдържанието на променливата. Ето нашия пример за поръчка, написан на PHP:

    Този код връща точно същия JSON низ като в примера с JavaScript:

    ("orderID":12345,"shopperName":"Ваня Иванов","shopperEmail":" [имейл защитен]","contents":[("productID":34,"productName":"Супер продукт","quantity":1),("productID":56,"productName":"Чудо продукт","количество": 3)],"поръчка завършена":вярно)

    В реално приложение вашият PHP скрипт ще изпрати този JSON низ като част от AJAX отговор на браузъра, където JavaScript кодът, използвайки метода JSON.parse(), ще го анализира обратно в променлива за показване на страницата на потребителя .

    Можете да подадете различни флагове като втори аргумент на функцията json_encode(). С тяхна помощ можете да промените принципите на кодиране на съдържанието на променливите в JSON низ.

    Създайте променлива от JSON низ

    За да конвертирате JSON низ в PHP променлива, използвайте метода json_decode(). Нека заменим нашия пример за JavaScript с метода JSON.parse() с PHP код:

    Както при JavaScript, този код ще генерира:

    [имейл защитен]Чудотворен продукт

    По подразбиране функцията json_decode() връща JSON обекти като PHP обекти. Има общи PHP обекти от класа stdClass. Ето защо използваме -> за достъп до свойствата на обекта в горния пример.

    Ако имате нужда от JSON обект като асоцииран PHP масив, трябва да подадете true като втори аргумент на функцията json_decode(). Например:

    $cart = json_decode($jsonString, true); echo $cart["shopperEmail"] . "
    "; echo $cart["contents"]["productName"] . "
    ";

    Този код ще произведе същия резултат:

    [имейл защитен]Чудотворен продукт

    Можете също така да подадете други аргументи към функцията json_decode(), за да укажете дълбочината на рекурсия и как да обработвате големи цели числа.

    Заключение

    Въпреки че JSON е лесен за разбиране и използване, той е много полезен и гъвкав инструмент за прехвърляне на данни между приложения и компютри, особено когато се използва AJAX. Ако планирате да разработите AJAX приложение, тогава няма съмнение, че JSON ще се превърне в основен инструмент във вашата работилница.

    ), и между самите сървъри (HTTP софтуерни интерфейси). Форматът JSON също е много подходящ за съхраняване на сложни динамични структури в релационни бази данни или файлови кешове.

    Тъй като JSON е подмножество на синтаксиса на JavaScript, той може бързо да бъде десериализиран с помощта на вградената функция eval(). Освен това е възможно да се вмъкнат напълно функционални JavaScript функции. В PHP, започвайки с версия 5.2.0, поддръжката на JSON е включена в ядрото под формата на функциите json_decode() и json_encode(), които сами преобразуват типовете данни JSON в съответните типове PHP и обратно.

    Синтаксис

    JSON е изграден върху две структури:

    • Набор от двойки ключ/стойност. На различни езици това се изпълнява като предмет, запис , структура , речник , хеш таблица , списък с ключ или асоциативен масив . Ключът може да бъде само низ, стойността може да бъде само произволна форма.
    • Номериран набор от стойности. На много езици това се изпълнява като масив, вектор, списък или последователност.

    Това са универсални структури от данни. На теория всички съвременни езици за програмиране ги поддържат под една или друга форма. Тъй като JSON се използва за обмен на данни между различни езици за програмиране, има смисъл да се изгражда върху тези структури.

    В JSON се използват следните форми:

    • Обектът е неподреден набор от двойки име/стойност, затворени във фигурни скоби ( ). Между името и стойността има символ ": " , а двойките име/стойност са разделени със запетаи.
    • Масивът (едномерен) е набор от стойности, които имат серийни номера (индекси). Масивът е ограден в квадратни скоби. Стойностите са разделени със запетаи.
    • Стойността може да бъде линияв двойни кавички, номер, стойност вярноили невярно, обект, масив, или стойност нула. Тези структури могат да бъдат вложени една в друга.
    • Низът е подреден набор от нула или повече Unicode символи, оградени в двойни кавички, използвайки екраниращи последователности с обратна наклонена черта. Знаците са представени като обикновен низ.
    • Името е низ.

    Линиямного подобен на низ в езиците и Java. Номерсъщо много подобно на C или 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 схема

    JSON Schema е един от езиците за описание на структурата на JSON документ. Използва JSON синтаксис. Базиран на концепциите на XML Schema, RelaxNG, Kwalify. JSON Schema е самоописателен език: когато се използва, същите инструменти за сериализация/десериализация могат да се използват за обработка на данни и описание на тяхната валидност.

    Използване на JSON в Ajax

    Следният примерен Javascript код показва как браузър може да използва XMLHttpRequest, за да поиска JSON-форматиран обект от сървъра (сървърната страна на програмата е пропусната; тя трябва да съдържа кода, който изпраща данните като 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( "Имаше проблем с URL адреса." ) ; ) http_request = null ; ) ) ;

    Имайте предвид, че този пример за използване на XMLHttpRequest не е универсален за всички браузъри (за браузъри, базирани на Internet Explorer, Opera, Safari и Mozilla, трябва да има някои разлики в кода). Използването на XMLHttpRequest е ограничено поради същата политика за произход: URL адресът на отговора на заявката трябва да бъде в същия DNS домейн като сървъра, на който се намира страницата, изискваща отговора. Алтернатива е подходът JSONP, който включва използване на кодирано извикване на функция, предавано между клиента и сървъра, така че клиентът да може да зареди JSON-кодирани данни от домейни на трети страни и да уведоми повикващия за завършване, въпреки че това въвежда някои рискове за сигурността и допълнителни изисквания към сървъра.

    Като алтернатива кодът на страницата може да използва елементи за асинхронно изискване на JSON данни или просто . Тези подходи бяха често срещани, преди да бъде налична широко разпространена поддръжка за XMLHttpRequest.

    Можете също да използвате същата политика за произход за прехвърляне на JSON данни с помощта на динамични тагове, но това води до уязвим код. Като по-безопасна алтернатива е предложено да се използва 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("(" + текст + ")" ) ;

    Като по-безопасна алтернатива на eval() е предложена нова функция, parseJSON(), която може да обработва само JSON данни. Той беше въведен във версия 4 на стандарта ECMAScript и е описан в статията „JSON: Нискомаслена алтернатива на XML“. Понастоящем се предлага като JavaScript библиотека и ще бъде включена в петото издание на ECMAScript.

    Вграден JSON

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

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

    Фалшифициране на заявки между домейни

    Лошото използване на JSON прави сайтовете уязвими за фалшифициране на междусайтови заявки (CSRF или XSRF). Тъй като маркерът позволява използването на източник, който не принадлежи към същия домейн като ресурса, който го използва, той позволява кодът да бъде изпълнен под прикритието на JSON данни в контекста на произволна страница, което прави възможно компрометиране на пароли или друга чувствителна информация на потребители, упълномощени за друг сайт.

    Това изглежда проблем само ако JSON данните съдържат поверителна информация, която може да бъде компрометирана от трета страна и ако сървърът разчита на политика за единичен произход ( Английски), блокирайки достъпа до данни, когато бъде открита външна заявка. Това не е проблем, ако сървърът определя валидността на заявката, предоставяйки данни само ако са правилни. HTTP бисквитките не могат да се използват за определяне на това. Изключителното използване на HTTP бисквитки се използва от фалшифициране на заявки между сайтове.

    JSONP и JSONPP

    JSONP (JSON Padding) или „JSON с padding“ е разширение на JSON, когато името на функция за обратно извикване е указано като входен аргумент.

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

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

    ("хартия": "А4", "брой": 5)

    Това обаче са само данни и не могат да повлияят на браузъра.

    Използвайки техниката JSONP, името на функцията за обратно извикване се предава на сървъра на трета страна в линията за повикване (GET):

    Тук параметърът jsonp съдържа името на функцията за обратно извикване parseResponse.

    Сега чуждият сървър example.com може да върне следния код:

    ParseResponse(( "хартия" : "A4" , "брой" : 5 ) )

    Сега кодът извиква javascript функцията на първия домейн.

    Идеята първоначално беше предложена в блога на MacPython през 2005 г. и в момента се използва от много Web 2.0 приложения като Dojo Toolkit Applications, Google Toolkit Applications и zanox Web Services. Предложени са допълнителни разширения на този протокол, които включват допълнителни аргументи, като например поддръжката на JSONPP за S3DB уеб услуги.

    Тъй като JSONP използва скриптови тагове, обажданията по същество са отворени за света. Поради тази причина JSONP може да е неподходящ за съхраняване на чувствителни данни.

    Активирането на скриптови тагове от отдалечени сайтове им позволява да предават всяко съдържание на сайта. Ако отдалеченият сайт има уязвимости, които позволяват инжектиране на Javascript, тогава оригиналният сайт също може да бъде засегнат от тях.

    JSONPP (параметризиран JSON с подложка) Параметризиран 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.

    Функция 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" ; // използване на подплатен, параметризиран json src = src+ "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval+ "&onload=remove_element_by_id("" + script.id + "")" ; script.src = src; headID.appendChild (скрипт) ; // извличане на отговор ) функция s3db_jsonpp(ans, jsonpp) ( eval(jsonpp) ; връщане ans ; ) функция remove_element_by_id(id) ( var e = document.getElementById (id) ; e.parentNode .removeChild (e) ; return false ; )

    В примера функцията s3db_jsonpp_call() създава скриптов елемент в DOM в заглавната част, чийто src съответства на JSONPP извикването.

    След получаване на отговор от сървъра ще бъде извикан s3db_jsonpp() - той се предава в параметрите на извикването, както трябва да бъде според правилата на JSONP.

    Вътре s3db_jsonpp() eval(jsonpp) ще задейства и ще върне стойността ans.

    Извикването на eval(onload) води до изпълнение на remove_element_by_id() с идентификатора на създадения скрипт в главата и в крайна сметка до изтриването му, тъй като той така или иначе няма да бъде използван, тъй като идентификаторът в примера е генериран на случаен принцип в самото начало на функцията s3db_jsonpp_call(). Това обаждане е в отговора на сървъра.

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

    Стандартът JSON не поддържа препратки към обекти, но Dojo Toolkit демонстрира как стандартният JSON може да поддържа такива препратки, използвайки допълнителни конвенции. По-специално, модулът dojox.json.ref осигурява поддръжка за няколко форми на връзки, включително кръгови, множествени, междудокументни и мързеливи връзки.

    Вижте също бележки
  • YAML не е език за маркиране (YAML™) Версия 1.2 (английски) . - Работен проект 2008-05-11.(недостъпна връзка - история) Посетен на 24 септември 2009.
  • . RedHanded (07 април 2005 г.). Посетен на 25 септември 2012. .
  • Json.ComПредложение за JSON схема (недостъпна връзка - история)
  • RFC 4627
  • JSON: Безмаслената алтернатива на XML. Архивирано
  • json2.js (английски) . Архивиран от оригинала на 12 февруари 2012 г. Посетен на 24 септември 2009 г.
  • Използване на вграден JSON.
  • Вграден JSON в IE8. Архивиран от оригинала на 12 февруари 2012 г.
  • Уеб спецификации, поддържани в Opera Presto 2.5 (английски) (10 март 2010 г.). Архивиран от оригинала на 12 февруари 2012 г. Посетен на 29 март 2010 г.
  • ES 3.1 имплементация на JSON обект.
  • Билет #4429lang=en . Архивиран от оригинала на 12 февруари 2012 г.
  • Билет #4429 (22 май 2009 г.). Архивиран от оригинала на 12 февруари 2012 г. Посетен на 3 юли 2009 г.
  • Билет #8111lang=en . Архивиран от оригинала на 12 февруари 2012 г.
  • MooTools Core & More 1.3.1. Архивиран от оригинала на 12 февруари 2012 г.
  • YUI 2: Помощна програма JSON (1 септември 2009 г.). Архивиран от оригинала на 12 февруари 2012 г. Посетен на 22 октомври 2009 г.
  • Научете JSON (7 април 2010 г.). Архивиран от оригинала на 12 февруари 2012 г. Посетен на 7 април 2010 г.
  • Джеръми ГросманРазширени техники за атака срещу уеб приложения, използващи GMail. Сигурност на WhiteHat. Архивиран от оригинала на 12 февруари 2012 г. Посетен на 23 септември 2009 г.
  • от __future__ import * » Отдалечен JSON - JSONP. Bob.pythonmac.org. Архивиран от оригинала на 12 февруари 2012 г. Посетен на 8 септември 2008 г.
  • Almeida, Jonas (11 юни 2008 г.). „JSON, JSONP, JSONPP? “(S3DB). Посетен на 26 април 2009 г.
  • RIAspot JSON P за Cross Site XHR .(недостъпна връзка - история)
  • JSON рефериране в Dojo. Архивиран от оригинала на 12 февруари 2012 г.
  • Връзки
    • Начална страница в официален формат на руски език
    • json.js, json2.js е библиотека, разработена от Дъглас Крокфорд за работа с JSON данни в JavaScript. Разширява обект с метода toJSONString, който след това присъства във всеки обект, и го преобразува в низ във формат JSON.
    • json-rpc.org (английски)
    Езици за маркиране на документиСлужебни документи

    Променливите, масивите и обектите са позната и удобна форма за представяне на данни. Обичайно е данните да се описват в езика на браузъра JavaScript, който не е необходим в езика на PHP сървъра. Форматът JSON ви позволява да ги обобщите в едно цяло и да не се фокусирате върху езика за програмиране. В този случай данните се превръщат в двойки: „име = стойност“. Стойността във всяка от тях може да бъде и колекция от такива двойки.

    Обичайно е JSON да се свързва с фигурни скоби и последното е напълно оправдано, тъй като форматът JSON = JavaScript Object Notation. Много се промени през последните особено динамични години. Създаденото с определена цел често носи неочаквани резултати или отваря нови хоризонти.

    Обмен на данни: браузър - сървър

    Технологията AJAX се превърна в традиционна, редовно опресняване на страницата изцялое престанал да бъде популярен. Посетител, отваряйки сайт, инициира серия от частичен обмен на данни, когато определени страници се променят само на мястото, което е подходящо.

    Смята се, че появата на JSON е свързана с използването на AJAX, но всъщност асоциативността и нейната обектна нотация (характеристики на синтаксиса за описание и използване на обекти) имат много по-свързана връзка с JSON, отколкото обменът на данни между браузъра и сървъра.

    Тъй като съдържанието на страниците на съвременните сайтове наистина стана „масивно“ (обемно), ефективността на формата за обмен на данни придоби особено значение. Това не означава, че JSON се е превърнал в ново представяне на данни, но фактът, че той отдавна е елемент от синтаксиса на JavaScript, е важен.

    Използването на кирилица при именуване на променливи е много неочаквано явление (глупости), но работи в най-новите версии на Chrome, Firefox и дори Internet Explorer 11.

    Кирилица и JSON

    Разбира се, няма смисъл да се използва това напълно неочаквано явление, като се помни колко лесно стойностите на променливите, написани с руски букви, се превръщат в безсмислици: какво можем да кажем за имената, особено външните.

    Съмнително е инициативата за имена на кирилица да бъде подкрепена от външната среда на браузъра, с която той непрекъснато трябва да се справя. Но този факт заслужава внимание поради простата причина, че форматът JSON е възможността да се пишат имена и стойности, както желае разработчикът. Това е важно, тъй като във всяка задача описанието на областта на приложението, както го изисква, значително опростява отстраняването на грешки и намалява броя на грешките.

    Няма значение каква точно е била основата на синтактичната иновация - JSON, важно е, че тя е дала законно право и реална възможност да се зададе съответствието: "всяко име = всяка стойност".

    Трябва да отдадем почит на езика на JavaScript: това, което се предоставя от синтаксиса, не задължава разработчика и не му налага нищо. Разработчикът свободно използва синтаксиса на езика, за да формира оптимално модел на данни и алгоритъм за тяхното използване.

    PHP и JSON

    Като приема данни във формат JSON, сървърът (по-специално чрез PHP) предоставя възможността да ги обработва такива, каквито са, и да връща резултата обратно на браузъра в подобен формат. PHP изходен масив:

    • $cJSON = масив ("a"=> "алфа", "b"=> "бета", "g"=> "гама").

    Конвертирайте в JSON за доставка до браузъра:

    • $cJS = json_encode($cJSON).

    Резултат:

    • ("a":"алфа","b":"бета","g":"гама").

    Показаното на снимката влагане е разрешено.

    Тук генерираният масив беше добавен с нов елемент „в себе си“ с автоматичен индекс „0“, а след това отново с посочения индекс „z“.

    Json_decode() преобразува JSON низ в PHP масив. Подобни резултати могат да бъдат постигнати чрез манипулиране на функции и explode(). В някои случаи този вариант е за предпочитане.

    Ниво на гнездене

    Елементите могат да бъдат вложени както от страната на браузъра, така и от страната на сървъра. На практика форматът JSON (стандартно описание RFC 4627) осигурява значително повече от 4 нива на влагане, но с тази функция не трябва да се злоупотребява.

    Най-добре е никога да не надхвърляте разумната достатъчност; това прави кода четим, което го прави по-лесен за отстраняване на грешки и разбиране за други разработчици.

    JSON обикновено се нарича конструкции от данни, които са по-прости от XML и разбираеми както за хората, така и за компютрите. Това е вярно, когато количеството данни е малко и разработчикът е избрал разумно нивото на влагане. Във всички останали случаи преброяването на броя на скобите и разбирането е трудно както от страна на браузъра, така и от страна на сървъра.

    JSON файлове

    Използването на JSON на практика често не се ограничава до четим от човека кратък низ. Всяка конструкция на данни винаги е прагматична. В същото време JSON може да се използва ефективно както в данни за реални задачи (корпоративен персонал), така и за внедряване на временни данни (кеш на обекти).

    Корпоративен персонал и JSON формат: пример

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

    Ако в една компания работят няколко души, това е едно, но ако са десетки хиляди, това е съвсем различно. Можете да продължите да използвате базата данни, но съхраняването й като файл изглежда по-практично и достъпно за използване.

    JSON е обикновен текстов файл. Случаят с щатното разписание се подразбира. Винаги можете да го прочетете. Отварянето и редактирането е достъпно и във всеки текстов редактор, който няма навика да добавя собствена служебна информация към съдържанието на файла. По принцип *.json е чист текст както вътре в браузъра, така и вътре във файла - низ.

    Снимката показва кеша на обекта, който формира картината, пример.

    Това е пример за съдържанието на файл, генериран от сайт, който предоставя цветен 3D печат върху чаши и керамика. Естествено, имайки такъв JSON формат, решаването как да го отворите е наистина проблематично. Въпреки това, в този и подобни случаи няма проблеми с четенето на файла: PHP чете файла, анализира го и го предава на браузъра. Данните, променени от посетителя, се връщат на сървъра и се записват обратно.

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

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

    XML и JSON

    „Има време за всичко“ е класическо знание, прието като аксиома още преди появата на програмирането. „Нищо не се появява просто така“ - това се е случило и преди човекът да напише първата разбираема програма на изкуствен език.

    Форматите на данни произтичат от реални нужди и се основават на постигнатото знание. HTML има свой собствен път, XML има свой собствен път, а JSON е обектна логика на JavaScript, разширена към други езици. Сравняването на един с друг не е най-доброто нещо, което можете да направите. Всеки с вкуса си.

    XML се справя чудесно със задачите си и явно няма да остане в историята. И JSON беше използван до 2006 г.; просто не всеки разработчик смяташе за свое задължение да декларира определени опции за представяне на своите данни.

    Има случаи в практиката, когато програми са написани на BASIC, които не използват JSON като такъв, но перфектно съхраняват двойки „име = стойност“ и ги правят достъпни за правилните алгоритми в точното време.

    Специални символи („`“, „~“, „|“, ...) и формати на данни

    Навикът да работите с асоциативни масиви и обекти в JavaScript прави използването на JSON естествено и удобно. Това е наистина страхотен формат, но способността за разделяне и обединяване, манипулиране на низове и масиви има много по-дълбоки корени.

    Функциите за присъединяване/разделяне на езика JavaScript и implode/explode на езика PHP ви позволяват удобно и ефективно да използвате както XML, JSON формати на данни, така и вашата собствена версия. Последният често е оптимален, докато първите два са идеални за опции за обща употреба. Ако информацията се прехвърля към друг разработчик, сървър, файл или база данни, няма по-добър начин за намиране на XML и JSON. Всички работят с тях, така че предаването/получаването на информация не изисква коментари.

    Използване на JSON в Android

    Четенето и записването на данни във формат JSON в Android е не само норма, но има и много обекти, фокусирани върху работата с този конкретен формат на данни.

    В този случай се използва формат JSON. Това може и да е вярно, но въпросът не е във феноменалността на социалните мрежи, а в това, че представянето на информация във формат „име = стойност“ е наистина удобно както за програмиране, така и за използване. За разлика от строгия и сложен „XML“, това е наистина удобен за хората формат.

    Асоциативни масиви

    Случва се така, че променливите трябва да бъдат описани (JavaScript) или поне трябва да се посочи начална стойност (PHP). И в двата случая променливата може много лесно да промени типа си. Езикът извършва това преобразуване автоматично, ако е необходимо.

    Но защо променливата да не промени името си, да се появи по време на изпълнението на алгоритъма и да изчезне, когато вече не е необходима? Асоциативните масиви решават този проблем, но тогава, когато се използват такива относително динамични променливи, името на масива и съответните синтактични конструкции ще следват мястото, където се използват.

    Това обстоятелство е особено изразено в PHP, но можете да се примирите с него, както и със символа "$" в името на променливата и комбинацията "$this->" вътре в обекта. Програмирайки едновременно на JavaScript и PHP, в началото наистина се удивлявате колко различно е всичко, но след това всичко става толкова познато и естествено...

    Асоциативен масив -> JSON

    В този пример *.docx документ е създаден с помощта на библиотеката PHPOffice/PHPWord, а масивът aProperties съдържа свойствата на този документ (автор, компания, заглавие, категория, дата на създаване...).

    Вторият масив съдържа данни за страницата:

    • ориентация (пейзажна или нормална);
    • вертикални и хоризонтални размери;
    • отстъпи (полета отляво, отгоре, отдолу, отдясно);
    • горни и долни колонтитули.

    Документът се генерира на сървъра, където е инсталирана библиотеката PHPOffice/PHPWord. Сайтът ви позволява да управлявате стойностите на тези масиви с помощта на JavaScript. Резултатът във формат JSON се връща обратно на сървъра и се използва в PHP алгоритми, в неговите конструкции, тоест в масиви.

    Динамични променливи

    Форматът JSON решава проблема с динамичните променливи. Тук можете да създавате, променяте и изтривате променливи без ненужно синтактично претрупване. Изглежда добре и се използва в JavaScript.

    В този пример функцията GetOjInfo() извлича името на стойността и стойността от обект. Първоначално низовият обект JSON, присвоен на променливата ojInfo, има три елемента: име, възраст и работа. Малко по-късно се добавя променливата Status.

    След първия оператор за изтриване редът ojInfo губи възрастовия елемент, след второто изтриване губи работния елемент. Ако приемем, че този низ е селекция от променливи, които имат определено значение, тогава с помощта на JSON можете действително да създавате, променяте и изтривате всякакви набори от тях извън оперативното поле (синтаксис) за описание и обработка на езика JavaScript.

    Форматът JSON не е предназначен за тази опция, но е възможен, практичен и удобен.

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

    JSON се основава на две структури от данни:

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

    Това са универсални структури от данни. Почти всички съвременни езици за програмиране ги поддържат под някаква форма. Логично е да се предположи, че форматът на данните, независим от езика за програмиране, трябва да се основава на тези структури.

    В JSON нотация изглежда така:

    Предмет- неподреден набор от двойки ключ/стойност. Обектът започва с ( отваряща къдрава скоба и завършва с ) затваряща къдрава скоба. Всяко име е последвано от: двоеточие, двойки ключ/стойност, разделени със запетая.

    Масив- подредена колекция от стойности. Масивът започва с [отворена квадратна скоба и завършва с] затваряща квадратна скоба. Стойностите са разделени със запетая.


    ЗначениеМоже би линияв двойни кавички, номер, вярно , невярно , нула , обектили масив. Тези структури могат да бъдат вложени.


    Линияе колекция от нула или повече Unicode символи, оградени в двойни кавички, използващи \ обратна наклонена черта като символ за екраниране. Символът е представен като низ от един знак. Подобен синтаксис се използва в C и Java.


    НомерТой е представен по същия начин както в C или Java, с изключение на това, че се използва само десетичната бройна система.


    Между всякакви токени могат да се използват интервали.

    С изключение на някои подробности за кодирането, горното напълно описва езика.