PHP 5.4の前に、 JSON_DECODEが非常に大きな整数に遭遇したとき、それを浮遊型に変換し、それがデータの損失につながる可能性があります。たとえば、JSONに多数がある場合:
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"big_number"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-number">12345678901234567890</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
PHP 5.3以前では、 JSON_DECODEを呼び出すときにこの数値が浮動型になる場合があり、精度が失われます。 PHP 5.4は、 json_bigint_as_string定数を導入します。この定数を指定すると、 JSON_DECODEは、浮動型に変換する代わりに、大きな整数を文字列として処理します。これにより、精度の損失の問題が回避されます。
例えば:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_BIGINT_AS_STRING);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]; </span><span><span class="hljs-comment">// 出力 "12345678901234567890"</span></span><span>
</span></span>
この方法は、金融、科学的コンピューティング、その他の分野に対処する必要があるアプリケーションに特に適しており、数値の精度が影響を受けないようにします。
json_pretty_print定数は早くもphp 5.3に存在していましたが、 json_decode関数に対する動作が変更されました。 PHP 5.4では、 json_pretty_printは主にjson_encode関数の出力形式に影響し、 json_decodeには影響しなくなります。ただし、開発者がデバッグ中にJSONデータの構造をより簡単に読み取り、理解するのに役立つため、この定数の役割を理解することは依然として重要です。
たとえば、 json_encodeはjson_pretty_print constantと併せて使用されます。
<span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'foo'</span></span><span> => </span><span><span class="hljs-string">'bar'</span></span><span>, </span><span><span class="hljs-string">'baz'</span></span><span> => </span><span><span class="hljs-string">'qux'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">json_encode</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, JSON_PRETTY_PRINT);
</span></span>
出力結果:
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"foo"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"bar"</span></span><span><span class="hljs-punctuation">,</span></span><span>
</span><span><span class="hljs-attr">"baz"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"qux"</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
JSON_DECODE自体はJSON文字列をフォーマットしませんが、開発者はJSON_ENCODEを実行するときに使用して、出力がよりフレンドリーで読みやすくなることを確認できます。
PHP 5.4は、 json_decodeの再帰解析機能も強化します。 JSON文字列にネストされた配列またはオブジェクトが含まれている場合、 JSON_DECODEはこれらの再帰構造をよりインテリジェントに処理し、より複雑なJSONデータを正しく解析できるようにします。例えば:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"person": {"name": "John", "age": 30}, "address": {"city": "New York", "zip": "10001"}}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>
出力:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[person] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[name] => John
[age] => </span><span><span class="hljs-number">30</span></span><span>
)
[address] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[city] => New York
[zip] => </span><span><span class="hljs-number">10001</span></span><span>
)
)
</span></span>
この改善により、開発者はネストされた構造の複雑さを心配することを避けることができ、JSONデータは多次元アレイまたはオブジェクトに直接変換できます。
PHP 5.4のJSON_DECODE関数は、非ASCII文字を含むJSON文字列を処理するときにUTF-8エンコードのサポートを強化します。 JSON_DECODEはPHP 5.3以前のUTF-8エンコードもサポートしていますが、PHP 5.4は、入力データが有効なUTF-8エンコーディングであることを確認するためにこれをより厳格に検証しました。
例えば:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "José"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>]; </span><span><span class="hljs-comment">// 出力 "José"</span></span><span>
</span></span>
この改善により、開発者は、特殊文字を含むJSONデータを処理する際に、予期しない解析エラーや問題のエンコードを経験しないようにします。
PHP 5.4は、 json_decode関数のエラー処理においていくつかの最適化を行いました。 json_decodeの解析が失敗すると、 nullが返されます。ただし、より詳細なエラー情報を取得するには、 json_last_error()関数を使用できます。 PHP 5.4の前に、エラーメッセージは比較的単純であり、開発者がエラーの特定の原因を判断することは困難な場合があります。 PHP 5.4はより多くのエラーコードを提供します。これにより、開発者がより正確に問題を見つけるのに役立ちます。
例えば:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "John", "age":}'</span></span><span>; </span><span><span class="hljs-comment">// 間違っている JSON 形式</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'JSON デコードエラー: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">json_last_error_msg</span></span><span>(); </span><span><span class="hljs-comment">// 出力详细的错误信息</span></span><span>
}
</span></span>
このようにして、開発者はJSONデータの形式の問題を簡単に識別および修正できます。