PHP json_encode
(PHP 5 >= 5.2.0, PHP 7, PECL json>= 1.2.0)
json_encode — Връща JSON представяне на данните
Връща низ, съдържащ JSON представянето за посочената стойност.
Кодирането се влияе от параметъра на опциите и в допълнение кодирането на плаващите стойности зависи от стойността на serialize_precision.
Списък с параметри
стойност - стойността, която трябва да бъде кодирана. Може да бъде от всякакъв тип с изключение на ресурс.
Функцията работи само с UTF-8 кодиране.
Забележка :
PHP имплементира надмножество на JSON, което е описано в оригиналния » RFC 7159.
Побитова маска, съставена отJSON_HEX_QUOT,JSON_HEX_TAG,JSON_HEX_AMP,JSON_HEX_APOS,JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT,JSON_UNESCAPED_SLASHES,JSON_FORCE_OBJECT,JSON_PRESERVE_ZERO_FRACTION,JSON_UNESCAPED_UNICODE,JSON_PARTIAL_OUTPUT_ON_ERROR,JSON_UNESCAPED_LINE_TERMINATORS,JSON_THROW _ON_ERROR. Значението на тези константи е обяснено на страницата JSON Constants.
Задава максималната дълбочина. Трябва да е по-голямо от нула.
Върнати стойности
Връща JSON-кодиран низ ( низ ) илиFALSE при грешка.
Списък на промените
Пример #1 Пример за използванеjson_encode()
1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
ехо json_encode ($arr); ?>
Резултатът от изпълнението на този пример:
Пример #2 Пример за използване наjson_encode() с опции
echo "Обикновено: " , json_encode ( $a ), "\n" ; echo "Етикети: " , json_encode ( $a , JSON_HEX_TAG ), "\n" ; echo "Апострофи: " , json_encode ( $a ,JSON_HEX_APOS ), "\n" ; echo "Кавички: " , json_encode ( $a , JSON_HEX_QUOT ), "\n" ; echo "Амперсанди: " , json_encode ( $a , JSON_HEX_AMP ), "\n" ; echo "Unicode: " , json_encode ( $a , JSON_ UNESCAPED_UNICODE ), "\n" ; echo "Всички: " , json_encode ( $a , JSON_HEX_TAG JSON_HEX_APOS JSON_HEX_QUOT JSON_HEX_AMP JSON_UNESCAPED_UNICODE ), "\n\n" ;
echo "Показване на празен масив като масив: " , json_encode ( $b ), "\n" ; echo "Показване на неасоциативен масив като обект: " , json_encode ( $b , JSON_FORCE_OBJECT ), "\n\n" ;
$c = масив(масив(1, 2, 3));
echo "Показване на неасоциативен масив като масив: " , json_encode ( $c ), "\n" ; echo "Показване на неасоциативен масив като обект: " , json_encode ( $c , JSON_FORCE_OBJECT ), "\n\n" ;
$d = array( 'foo' => 'bar' , 'baz' => 'long' );
echo "Асоциативен масив винаги се изобразява като обект: " , json_encode ( $d ), "\n" ; echo "Асоциативен масив винаги се изобразява като обект: " , json_encode ( $d , JSON_FORCE_OBJECT ), "\n\n" ; ?>
Резултатът от изпълнението на този пример:
Пример #3 JSON_NUMERIC_CHECK пример за опция
Резултатът от изпълнението на този пример ще бъде нещо подобно:
Пример #4 Пример с последователни индекси, базирани на нула, и непоследователни индекси на масиви
"foo" , 2 => "лента" , 3 => "baz", 4 => "блонга"); var_dump ( $nonsequential, json_encode ($nonsequential) );
ехо PHP_EOL. „Последователен масив с премахнат един индекс“ . PHP_EOL ; unset( $sequential [ 1 ]); var_dump ( $sequential, json_encode ($sequential) ); ?>
Резултатът от изпълнението на този пример:
Пример #5 Примеризползвайки опцияJSON_PRESERVE_ZERO_FRACTION
Резултатът от изпълнението на този пример:
Бележки
Забележка :
В случай на грешка в кодирането, json_last_error() може да се използва за определяне на точната грешка.
Забележка :
Когато кодирате масив, ако неговите индекси не са последователни числа от нула, тогава всички индекси се кодират в низови ключове за всяка двойка индекс-стойност.
Забележка :
Подобно на референтния JSON енкодер,json_encode() ще произведе JSON като проста стойност (т.е. не обект или масив), ако му бъде даден низ, цяло число, плаващо число или булев тип като входна стойност. Повечето декодери приемат тези стойности като валиден JSON, но някои не, защото спецификацията е двусмислена за това.
Винаги проверявайте дали вашият JSON декодер може правилно да обработва данните, които генерирате сjson_encode().
Вижте също
- JsonSerializable
- json_decode() - Декодира JSON низ
- json_last_error() - Връща последната грешка
- serialize() - Генерира съхраняемо представяне на променлива
Допринесени от потребителя бележки 47 бележки
Това не се споменава в документацията нито за PHP, нито за jQuery, но ако предавате JSON данни на програма на javascript, уверете се, че вашата програма започва с:
Сигурни ли сте, че искате да използвате JSON_NUMERIC_CHECK, наистина наистина сигурни?
Просто гледайте този случай на употреба:
И тогава получавате този JSON:
Може би има смисъл за PHP (тъй като is_numeric('+33123456789') връща true), но наистина, да го преобразувам като int?!
Бележка за внимание: Ако се чудите защо json_encode() кодиравашия PHP масив като JSON обект вместо JSON масив, може да искате да проверите отново ключовете на масива си, защото json_encode() приема, че вашият масив е обект, ако ключовете ви не са последователни.
Както можете да видите, ключовете са последователни; $myarray ще бъде правилно кодиран като JSON масив.
Отмяната на елемент също ще премахне ключовете. json_encode() сега ще приеме, че това е обект и ще го кодира като такъв.
РЕШЕНИЕ: Използвайте array_values(), за да преиндексирате масива.
Моля, имайте предвид, че имаше (все още) недокументирана промяна на функцията json_encode() между 2 версии на PHP по отношение на JSON_PRETTY_PRINT:
Във версия 5.4.21 и по-стари, празен масив [], използващ JSON_PRETTY_PRINT, ще бъде изобразен като 3 реда, като вторият е празен (с отстъп) ред, т.е.: "данни": [
Във версия 5.4.34 и по-нова, празен масив [], използващ JSON_PRETTY_PRINT, ще бъде изобразен точно като [] на мястото, където се среща, т.е. "данни: [],
Това не се споменава никъде в списъка с промени на PHP и документацията за мигриране; нито на страницата с документация на json_encode.
Това е много полезно да знаете, когато анализирате JSON с помощта на регулярни изрази за ръчно вмъкване на части от данни, какъвто е случаят с текущия ми случай на употреба (работата с JSON експортиране на над няколко гигабайта изисква подоперации и вмъкване на данни).
Това е предназначено да бъде проста четима функция за кодиране на json за PHP 5.3+ (и лицензирана под GNU/AGPLv3 или GPLv3, както предпочитате):
$value ) $out .= str_repeat ( "\t", $indent + 1); $out .= "\"" . $_escape ((низ) $key). "\": " ;
if ( is_object ( $value ) is_array ( $value )) $out .= "\n" ; $out .= $_myself ($value, $indent + 1); > друго ако (is_bool ( $value )) $out .= $value? 'вярно невярно' ; > elseif ( is_null ( $value )) $out .= 'null' ; > elseif ( is_string ( $value )) $out .= "\"" . $_escape ( $value ). "\"" ; > else $out .= $value; >
if (!empty( $out )) $out = substr ($out, 0, - 2); >
$out = str_repeat ("\t", $indent) . " $out .= "\n" . str_repeat ( "\t" , $indent ) . ">" ;
Решение за специални знаци UTF-8.
Ако трябва да принудите обект (напр.: празен масив), можете също да направите:
който действа по същия начин като
Попаднах на „грешка“, при която изпълнението на json_encode() върху SimpleXML обект игнорираше CDATA. Попаднах на http://bugs.php.net/42001 и http://bugs.php.net/41976 и въпреки че съм съгласен с плаката, че документацията трябва да изяснява проблеми като този, успях да разбера как да го заобиколя.
Трябва да конвертирате обекта SimpleXML обратно в XML низ, след което да го импортирате отново обратно в SimpleXML, като използвате опцията LIBXML_NOCDATA. След като направите това, можете да използвате json_encode() и пак да си върнете CDATA.
Въпреки че това не е документирано в регистрационния файл на версията тук, поведението при обработка на не-UTF8 се промени в 5.5 по начин, който може да затрудни отстраняването на грешки.
Предаването на низ, различен от UTF-8, към json_encode() ще накара функцията да върне false в PHP 5.5, докато в предишните версии ще анулира само този низ (и само този).
Във файл, кодиран с Latin-1, напишете това:
Разбира се, PHP 5.5 го има правилно (ако кодирането е неуспешно, връща false), но има вероятност да въведе грешки при актуализиране до 5.5, защото преди това можехте да получите останалата част от JSON, дори когато един низ не беше в UTF8 (ако този низ не беше използван, никога нямаше да уведомите, че е нулиран)
Тази функция има странно поведение по отношение на докладването на грешки в PHP версия 5.4 или по-стара. Този вид предупреждение се извежда само ако конфигурирате PHP с "display_errors=Off" (!?): "PHP предупреждение: json_encode(): невалидна UTF-8 последователност в аргумента. "
Можете да възпроизведете това поведение:
Исках да направя свойствата на обекта частни и да използвам гетери и сетери, но имах нужда те да могат да се сериализират в json, без да губя частните променливи. (Исках да популяризирам добри практики за кодиране, но имах нужда от свойствата от страна на клиента.) Поради това трябваше да кодирам не само нормалните частни свойства, но и свойства, които бяха масиви от други моделни обекти. Търсих известно време без успех, така че кодирах моя собствен:
Можете да поставите тези методи във всеки от вашите класове или да ги поставите в базов клас, както направих аз. (Но имайте предвид, че за да работи това, дъщерните класове трябва да декларират свойствата си като защитени, така че родителският клас да има достъп)
processArray ( get_object_vars ( $this )); >
частна функция processArray ( $array ) foreach ( $array as $key => $value ) if ( is_object ( $value )) $array [ $key ] = $value -> toArray (); > if ( is_array ( $value )) $array [ $key ] = $this -> processArray ($стойност); > > // Ако свойството не е обект или масив, оставете го недокоснато return $array ; >
публична функция __toString () връща json_encode ( $this -> toArray ()); >
Външно можете просто да се обадите
И ще получите json за този обект. Надявам се това да помогне на някого!
За всеки, който би искал да кодира масиви в JSON, но използва PHP 4 и не иска да спори с PECL, ето функция, която написах в PHP4 за преобразуване на вложени масиви в JSON.
азне правете претенции, че тази функция по никакъв начин е завършена (например, тя не обработва обекти), така че ако имате някакви подобрения, давайте.
"baz") ще бъде преведено в *, но array("foo", "bar") ще бъде преведено в [ "foo", "bar" ]. * * @param $array Масивът за конвертиране. * @return mixed Полученият JSON низ или false, ако аргументът не е масив. * @author Andy Rusterholz */ функция array_to_json ( $array )
if( ! is_array ( $array ) ) < върни невярно; >
$асоциативен = брой ( array_diff ( array_keys ( $array ), array_keys ( array_keys ( $array )) )); ако ($асоциативно)
$construct = array(); foreach( $array като $key => $value )
// Форматиране на ключа: if( is_numeric ( $key ) ) < $key = "key_ $key " ; > $key = '"' . добавя наклонени черти ($key). '"' ;
// Форматирайте стойността: if( is_array ( $value )) < $стойност = array_to_json ($стойност); > else if( ! is_numeric ( $value ) is_string ( $value ) ) < $value = '"' . добавя наклонени черти ( $value ). '"' ; >
// Добавяне към етапен масив: $construct [] = " $key : $value " ; >
// След това свиваме сценичния масив във формата JSON: $result = "< ". implode ( ", " , $construct ). " >" ;
$construct = array(); foreach($масив като $стойност)
// Форматирайте стойността: if( is_array ( $value )) < $стойност = array_to_json ($стойност); > else if( ! is_numeric ( $value ) is_string ( $value ) ) < $value = '"' . добавя наклонени черти ( $value ). '"' ; >
// Добавяне към етапен масив: $construct [] = $value ; >
// След това свиваме сценичния масив във формата JSON: $result = "[ " . implode ( ", " , $construct ). "]" ; >