Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
306 changes: 306 additions & 0 deletions reference/simdjson/functions/simdjson-decode.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,306 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 78cc29837ed269491a4fc330797c7184eca7ed2f Maintainer: lacatoire Status: ready -->
<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="function.simdjson-decode">
<refnamediv>
<refname>simdjson_decode</refname>
<refpurpose>JSON 文字列をデコードする</refpurpose>
</refnamediv>

<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>simdjson_decode</methodname>
<methodparam><type>string</type><parameter>json</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>associative</parameter><initializer>&false;</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>depth</parameter><initializer>512</initializer></methodparam>
</methodsynopsis>
<simpara>
JSON エンコードされた文字列を受け取り、PHP の値に変換します。
コンピュータアーキテクチャがサポートしている場合、
<function>json_decode</function> よりも高速な
SIMD (Simultaneous Instruction, Multiple Data) 実装を使用します。
</simpara>
</refsect1>

<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>json</parameter></term>
<listitem>
<simpara>
デコードする JSON <type>string</type>。
</simpara>
<simpara>
この関数は UTF-8 でエンコードされた文字列でのみ動作します。
</simpara>
<simpara>
この関数は <function>json_decode</function> がデコードできる
有効な入力をパースしますが、4 GiB 未満の長さに限ります。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>associative</parameter></term>
<listitem>
<simpara>
&true; の場合、JSON オブジェクトは連想配列 (&array;) として返されます。
&false; の場合、JSON オブジェクトは &object; として返されます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>depth</parameter></term>
<listitem>
<simpara>
デコードする構造のネストの最大深さ。
値は <literal>0</literal> より大きく、
<literal>2147483647</literal> 以下でなければなりません。

呼び出し側は妥当な小さい値を使用するべきです。
現在の <function>json_decode</function> の実装とは異なり、
大きな深さはより多くのバッファ領域を必要とし、
再帰の深さが増加します。
</simpara>
</listitem>
</varlistentry>
</variablelist>
</refsect1>

<refsect1 role="returnvalues">
&reftitle.returnvalues;
<simpara>
<parameter>json</parameter> でエンコードされた値を適切な
PHP の型として返します。<literal>true</literal>、<literal>false</literal>、
<literal>null</literal> はそれぞれ &true;、&false;、&null;
として返されます。
</simpara>
</refsect1>

<refsect1 role="errors">
&reftitle.errors;
<simpara>
<parameter>json</parameter> が無効な場合、PECL simdjson 2.1.0 以降では
<classname>SimdJsonException</classname> がスローされます。
以前は <classname>RuntimeException</classname> がスローされていました。
</simpara>
<simpara>
<parameter>depth</parameter> が許容範囲外の場合、
PECL simdjson 3.0.0 以降では <classname>SimdJsonValueError</classname>
がスローされます。以前は <constant>E_WARNING</constant>
レベルのエラーが発生していました。
</simpara>
</refsect1>

<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>simdjson_decode</function> の例</title>
<programlisting role="php">
<![CDATA[
<?php
$json = '{"a":1,"b":2,"c":3}';

var_dump(simdjson_decode($json));
var_dump(simdjson_decode($json, true));

?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(stdClass)#1 (3) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(3)
}
array(3) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(3)
}
]]>
</screen>
</example>
<example>
<title>無効なオブジェクトプロパティへのアクセス</title>
<simpara>
PHP の命名規則で許可されていない文字 (ハイフンなど) を含む
オブジェクト内の要素にアクセスするには、
要素名を波括弧とアポストロフィで囲みます。
</simpara>
<programlisting role="php">
<![CDATA[
<?php

$json = '{"foo-bar": 12345}';

$obj = simdjson_decode($json);
print $obj->{'foo-bar'}; // 12345

?>
]]>
</programlisting>
</example>
<example>
<title><function>simdjson_decode</function> でよくある間違い</title>
<programlisting role="php">
<![CDATA[
<?php

// 以下の文字列は有効な JavaScript ですが、有効な JSON ではありません

// 名前と値はダブルクォートで囲む必要があります
// シングルクォートは無効です
$bad_json = "{ 'bar': 'baz' }";
simdjson_decode($bad_json); // SimdJsonException をスロー

// 名前はダブルクォートで囲む必要があります
$bad_json = '{ bar: "baz" }';
simdjson_decode($bad_json); // SimdJsonException をスロー

// 末尾のカンマは許可されていません
$bad_json = '{ bar: "baz", }';
simdjson_decode($bad_json); // SimdJsonException をスロー

?>
]]>
</programlisting>
</example>
<example>
<title><parameter>depth</parameter> エラー</title>
<programlisting role="php">
<![CDATA[
<?php
// 最大深さ 4 でデータをエンコード
// (array -> array -> array -> string)
$json = json_encode(
[
1 => [
'English' => [
'One',
'January'
],
'French' => [
'Une',
'Janvier'
]
]
]
);

// 異なる深さでのエラーを表示
var_dump(simdjson_decode($json, true, 4));
try {
var_dump(simdjson_decode($json, true, 3));
} catch (SimdJsonException $e) {
echo "Caught: ", $e->getMessage(), "\n";
}
?>
]]>
</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"
}
}
}
Caught: The JSON document was too deep (too many nested objects and arrays)
]]>
</screen>
</example>
<example>
<title><function>simdjson_decode</function> での大きな整数</title>
<programlisting role="php">
<![CDATA[
<?php
$json = '{"number": 12345678901234567890}';

var_dump(simdjson_decode($json));

?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(stdClass)#1 (1) {
["number"]=>
float(1.2345678901235E+19)
}
]]>
</screen>
</example>
</para>
</refsect1>

<refsect1 role="notes">
&reftitle.notes;
<note>
<simpara>
JSON 仕様は JavaScript ではなく、JavaScript のサブセットです。
</simpara>
</note>
<note>
<simpara>
デコードに失敗した場合、
<classname>SimdJsonException</classname> がスローされ、
<methodname>SimdJsonException::getCode</methodname> と
<methodname>SimdJsonException::getMessage</methodname> を使用して
エラーの正確な内容を特定できます。
</simpara>
</note>
</refsect1>

<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><function>json_encode</function></member>
<member><function>json_decode</function></member>
</simplelist>
</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
-->
Loading