Files
php-doc-ru/reference/json/functions/json-encode.xml
Sergey Panteleev 6d43fd64d7 Исправление форматирования
[skip-spellcheck]
[skip-lint]
2022-12-27 03:42:36 +03:00

425 lines
14 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: 19e8122137a1d42ed60f17fe2c0c2b69b0b2d16b 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>
Если сериализуемое значение является объектом, то по умолчанию будут включены только публично видимые свойства.
В качестве альтернативы класс может реализовать интерфейс <interfacename>JsonSerializable</interfacename>
для управления тем, как его значения сериализуются в <acronym>JSON</acronym>.
</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.serialize-precision">serialize_precision</link> вместо <link
linkend="ini.precision">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>
При кодировании массива в случае, если его индексы не являются
последовательными числами от нуля, то все индексы кодируются в строковые
ключи для каждой пары индекс-значение.
</para>
</note>
<note>
<para>
Как и эталонный кодировщик JSON, <function>json_encode</function>
будет создавать JSON в виде простого значения (то есть не объект и не массив),
если ему переданы типы &string;, &integer;, &float; или &boolean; в качестве входящего значения
<parameter>value</parameter>. Большинство декодеров воспринимают эти значения
как правильный 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>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
-->