Files
php-doc-ru/reference/json/functions/json-decode.xml
Alexey Pyltsyn a7f89bbf29 Upd
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@345976 c90b9560-bf6c-de11-be94-00142212c4b1
2018-11-12 20:51:15 +00:00

383 lines
11 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: d15746f50cbc3cbba5580bfaecf3e75bd506ca08 Maintainer: irker Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<refentry xml:id="function.json-decode" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>json_decode</refname>
<refpurpose>Декодирует строку JSON</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>json_decode</methodname>
<methodparam><type>string</type><parameter>json</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>assoc</parameter><initializer>&false;</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>depth</parameter><initializer>512</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>options</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
<para>
Принимает закодированную в JSON строку и преобразует ее в переменную PHP.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>json</parameter></term>
<listitem>
<para>
Строка (<type>string</type>) <parameter>json</parameter> для декодирования.
</para>
<para>
Эта функция работает только со строками в кодировке UTF-8.
</para>
&json.implementation.superset;
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>assoc</parameter></term>
<listitem>
<para>
Если &true;, возвращаемые объекты будут преобразованы в ассоциативные массивы.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>depth</parameter></term>
<listitem>
<para>
Указывает глубину рекурсии.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem>
<para>
Битовая маска из констант <constant>JSON_BIGINT_AS_STRING</constant>,
<constant>JSON_OBJECT_AS_ARRAY</constant>,
<constant>JSON_THROW_ON_ERROR</constant>.
Поведение этих констант описаны на странице
<link linkend="json.constants">JSON-констант</link>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает данные <parameter>json</parameter>, преобразованные в соответствующие
типы PHP. Значения <literal>true</literal>, <literal>false</literal> и
<literal>null</literal> возвращаются как &true;, &false;
и &null; соответственно. &null; также возвращается, если <parameter>json</parameter>
не может быть преобразован или закодированные данные содержат вложенных уровней
больше, чем допустимый предел для рекурсий.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Примеры использования <function>json_decode</function></title>
<programlisting role="php">
<![CDATA[
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
]]>
</screen>
</example>
<example>
<title>Доступ к свойствам объектов с неправильными именами</title>
<simpara>
Доступ к элементам объекта, которые содержат символы, недопустимые
в соответствии с соглашением об именах PHP (то есть дефис), может быть выполнен
путем обрамления имени элемента фигурными скобками и апострофами.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345
?>
]]>
</programlisting>
</example>
<example>
<title>Распространенная ошибка при использовании <function>json_decode</function></title>
<programlisting role="php">
<![CDATA[
<?php
// Следующие строки являются валидным кодом JavaScript, но не валидными JSON-данными
// Имя и значение должны помещаться в двойные кавычки
// Одинарные кавычки использовать нельзя
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
// Имя должно обрамляться в двойные кавычки
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null
// Не должно быть завершающей запятой (без последующего элемента)
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null
?>
]]>
</programlisting>
</example>
<example>
<title>Ошибки с глубиной вложенных объектов (<parameter>depth</parameter>)</title>
<programlisting role="php">
<![CDATA[
<?php
// Кодирование данных.
$json = json_encode(
array(
1 => array(
'English' => array(
'One',
'January'
),
'French' => array(
'Une',
'Janvier'
)
)
)
);
// Создаем массив с ошибками.
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
if (!strncmp($name, "JSON_ERROR_", 11)) {
$json_errors[$value] = $name;
}
}
// Отображаем ошибки для разных глубин рекурсий
foreach (range(4, 3, -1) as $depth) {
var_dump(json_decode($json, true, $depth));
echo 'Последняя ошибка: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(1) {
[1]=>
array(2) {
["English"]=>
array(2) {
[0]=>
string(3) "One"
[1]=>
string(7) "January"
}
["French"]=>
array(2) {
[0]=>
string(3) "Une"
[1]=>
string(7) "Janvier"
}
}
}
Последняя ошибка: JSON_ERROR_NONE
NULL
Последняя ошибка: JSON_ERROR_DEPTH
]]>
</screen>
</example>
<example>
<title><function>json_decode</function> с большими целыми числами</title>
<programlisting role="php">
<![CDATA[
<?php
$json = '{"number": 12345678901234567890}';
var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(stdClass)#1 (1) {
["number"]=>
float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
["number"]=>
string(20) "12345678901234567890"
}
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
Спецификация JSON - это не JavaScript, а его подмножество.
</para>
</note>
<note>
<para>
В случае ошибки декодирования можно использовать
<function>json_last_error</function> для определения ее причины.
</para>
</note>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.1.0</entry>
<entry>
Пустой ключ JSON ("") будет преобразован в пустое свойство объекта, а не
в свойство со значением <literal>_empty_</literal>.
</entry>
</row>
<row>
<entry>7.0.0</entry>
<entry>
Отклонены несовместимые форматы чисел RFC 7159 - верхний уровень
(07, 0xff, .1, -.1) и на всех уровнях ([1.], [1.e1])
</entry>
</row>
<row>
<entry>7.0.0</entry>
<entry>
Пустые строки PHP или значения, которые после преобразования в строки становятся
пустыми строками (<literal>NULL</literal>, <literal>FALSE</literal>) приведут к ошибке
синтаксиса JSON.
</entry>
</row>
<row>
<entry>5.6.0</entry>
<entry>
Недопустимые варианты <literal>true</literal>,
<literal>false</literal> и <literal>null</literal> не в нижнем регистре больше
не принимают в качестве допустимого ввода и будут генерировать предупреждения.
</entry>
</row>
<row>
<entry>5.4.0</entry>
<entry>
Был добавлен параметр <parameter>options</parameter>.
</entry>
</row>
<row>
<entry>5.3.0</entry>
<entry>
Добавлен опциональный параметр <parameter>depth</parameter>.
Глубина рекурсии по умолчанию увеличена с 128 до 512
</entry>
</row>
<row>
<entry>5.2.3</entry>
<entry>
Глубина рекурсии увеличена с 20 до 128
</entry>
</row>
<row>
<entry>5.2.1</entry>
<entry>
Добавлена поддержка декодирования основных типов JSON.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>json_encode</function></member>
<member><function>json_last_error</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->