Files
php-doc-ru/reference/json/functions/json-encode.xml
2024-07-26 11:14:07 +03:00

446 lines
15 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: 9f2e30a00afda6d6b6a3e19b13956150c2eaf2c1 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.json-encode" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>json_encode</refname>
<refpurpose>Возвращает JSON-представление данных</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>string</type><type>false</type></type><methodname>json_encode</methodname>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>flags</parameter><initializer>0</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>depth</parameter><initializer>512</initializer></methodparam>
</methodsynopsis>
<para>
Функция возвращает строку, которая содержит JSON-представление значения <parameter>value</parameter>.
Функция рекурсивно сериализует значение параметра, если параметр — массив (&array;) или объект (&object;).
</para>
<para>
По умолчанию функция включит в результирующую строку только открытые свойства, если значение,
которое сериализует функция, — объект.
Чтобы создать альтернативу внутренней сериализации и самому управлять тем, как значения объекта
сериализуются в <acronym>JSON</acronym>,
в классе реализуют интерфейс <interfacename>JsonSerializable</interfacename>.
</para>
<para>
На кодирование влияет параметр <parameter>flags</parameter>,
а кодирование значений &float; зависит от значения директивы
<link linkend="ini.serialize-precision">serialize_precision</link>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>value</parameter></term>
<listitem>
<para>
Параметр <parameter>value</parameter> — значение, которое закодирует функция.
Разрешены все типы, кроме &resource;.
</para>
<para>
Функция работает только с кодировкой UTF-8.
</para>
&json.implementation.superset;
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
Битовая маска, которую составили из значений
<constant>JSON_FORCE_OBJECT</constant>,
<constant>JSON_HEX_QUOT</constant>,
<constant>JSON_HEX_TAG</constant>,
<constant>JSON_HEX_AMP</constant>,
<constant>JSON_HEX_APOS</constant>,
<constant>JSON_INVALID_UTF8_IGNORE</constant>,
<constant>JSON_INVALID_UTF8_SUBSTITUTE</constant>,
<constant>JSON_NUMERIC_CHECK</constant>,
<constant>JSON_PARTIAL_OUTPUT_ON_ERROR</constant>,
<constant>JSON_PRESERVE_ZERO_FRACTION</constant>,
<constant>JSON_PRETTY_PRINT</constant>,
<constant>JSON_UNESCAPED_LINE_TERMINATORS</constant>,
<constant>JSON_UNESCAPED_SLASHES</constant>,
<constant>JSON_UNESCAPED_UNICODE</constant>,
<constant>JSON_THROW_ON_ERROR</constant>.
Значение этих констант объясняет
<link linkend="json.constants">страница JSON-констант</link>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>depth</parameter></term>
<listitem>
<para>
Устанавливает максимальную глубину. Значение параметра должно
быть больше нуля.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает строку (&string;) в формате JSON&return.falseforfailure;.
</para>
</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.3.0</entry>
<entry>
Добавлена константа
<constant>JSON_THROW_ON_ERROR</constant>
для параметра <parameter>flags</parameter>.
</entry>
</row>
<row>
<entry>7.2.0</entry>
<entry>
Добавлены константы
<constant>JSON_INVALID_UTF8_IGNORE</constant> и
<constant>JSON_INVALID_UTF8_SUBSTITUTE</constant>
для параметра <parameter>flags</parameter>.
</entry>
</row>
<row>
<entry>7.1.0</entry>
<entry>
Добавлена константа
<constant>JSON_UNESCAPED_LINE_TERMINATORS</constant>
для параметра <parameter>flags</parameter>.
</entry>
</row>
<row>
<entry>7.1.0</entry>
<entry>
При кодировании чисел с плавающей точкой (<type>float</type>)
вместо значения директивы <link
linkend="ini.precision">precision</link> функция учитывает
значение директивы <link
linkend="ini.serialize-precision">serialize_precision</link>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования функции <function>json_encode</function></title>
<programlisting role="php">
<![CDATA[
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
{"a":1,"b":2,"c":3,"d":4,"e":5}
]]>
</screen>
</example>
<example>
<title>
Пример использования функции <function>json_encode</function> с опциями
</title>
<programlisting role="php">
<![CDATA[
<?php
$a = array('<foo>', "'bar'", '"baz"', '&blong&', "\xc3\xa9");
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 "Юникод: ", 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";
$b = array();
echo "Отображение пустого массива как массива: ", json_encode($b), "\n";
echo "Отображение неассоциативного массива как объекта: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n";
$c = array(array(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";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Обычно: ["<foo>","'bar'","\"baz\"","&blong&","\u00e9"]
Теги: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"]
Апострофы: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
Кавычки: ["<foo>","'bar'","\u0022baz\u0022","&blong&","\u00e9"]
Амперсанды: ["<foo>","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"]
Юникод: ["<foo>","'bar'","\"baz\"","&blong&","é"]
Все: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","é"]
Отображение пустого массива как массива: []
Отображение неассоциативного массива как объекта: {}
Отображение неассоциативного массива как массива: [[1,2,3]]
Отображение неассоциативного массива как объекта: {"0":{"0":1,"1":2,"2":3}}
Ассоциативный массив всегда отображается как объект: {"foo":"bar","baz":"long"}
Ассоциативный массив всегда отображается как объект: {"foo":"bar","baz":"long"}
]]>
</screen>
</example>
<example>
<title>Пример использования опции JSON_NUMERIC_CHECK</title>
<programlisting role="php">
<![CDATA[
<?php
echo "Строки, которые содержат числа, преобразовываются в числа" . PHP_EOL;
$numbers = array('+123123', '-123123', '1.2e3', '0.00001');
var_dump(
$numbers,
json_encode($numbers, JSON_NUMERIC_CHECK)
);
echo "Строки, которые содержат некорректно заданные числа" . PHP_EOL;
$strings = array('+a33123456789', 'a123');
var_dump(
$strings,
json_encode($strings, JSON_NUMERIC_CHECK)
);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Строки, которые содержат числа, преобразовываются в числа
array(4) {
[0]=>
string(7) "+123123"
[1]=>
string(7) "-123123"
[2]=>
string(5) "1.2e3"
[3]=>
string(7) "0.00001"
}
string(28) "[123123,-123123,1200,1.0e-5]"
Строки, которые содержат некорректно заданные числа
array(2) {
[0]=>
string(13) "+a33123456789"
[1]=>
string(4) "a123"
}
string(24) "["+a33123456789","a123"]"
]]>
</screen>
</example>
<example>
<title>Пример с последовательными индексами, которые начинаются с нуля, и
непоследовательными индексами массивов</title>
<programlisting role="php">
<![CDATA[
<?php
echo "Последовательный массив" . PHP_EOL;
$sequential = array("foo", "bar", "baz", "blong");
var_dump(
$sequential,
json_encode($sequential)
);
echo PHP_EOL . "Непоследовательный массив" . PHP_EOL;
$nonsequential = array(1 => "foo", 2 => "bar", 3 => "baz", 4 => "blong");
var_dump(
$nonsequential,
json_encode($nonsequential)
);
echo PHP_EOL . "Последовательный массив с одним удалённым индексом" . PHP_EOL;
unset($sequential[1]);
var_dump(
$sequential,
json_encode($sequential)
);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Последовательный массив
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(27) "["foo","bar","baz","blong"]"
Непоследовательный массив
array(4) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(3) "baz"
[4]=>
string(5) "blong"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"
Последовательный массив с одним удалённым индексом
array(3) {
[0]=>
string(3) "foo"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"
]]>
</screen>
</example>
<example>
<title>Пример использования опции <constant>JSON_PRESERVE_ZERO_FRACTION</constant></title>
<programlisting role="php">
<![CDATA[
<?php
var_dump(json_encode(12.0, JSON_PRESERVE_ZERO_FRACTION));
var_dump(json_encode(12.0));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(4) "12.0"
string(2) "12"
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
Функция <function>json_last_error</function> помогает определить точную причину ошибки,
если возникла ошибка кодирования.
</para>
</note>
<note>
<para>
Функция кодирует ключи как строковые и для каждой пары ключ-значение
указывает ключи явным образом, если при кодировании массива ключи
нарушают непрерывную числовую последовательность, которая начинается с 0.
</para>
</note>
<note>
<para>
Как и эталонный JSON-кодировщик, функция <function>json_encode</function>
сгенерирует JSON в виде простого значения, а не объекта или массива,
если входное значение параметра <parameter>value</parameter>&string;, &integer;, &float; или &boolean;.
Декодеры будут принимать эти значения как корректный JSON, но часть декодеров не примет,
потому что спецификация в этом отношении неоднозначна.
</para>
<para>
Заключение: проверяйте, правильно ли JSON-декодер обрабатывает
вывод, который генерирует функция <function>json_encode</function>.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><interfacename>JsonSerializable</interfacename></member>
<member><function>json_decode</function></member>
<member><function>json_last_error</function></member>
<member><function>json_last_error_msg</function></member>
<member><function>serialize</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
-->