Avant PHP 5.4, lorsque JSON_DECODE a rencontré un très grand entier, il l'a converti en un type flottant, ce qui pourrait entraîner une perte de données. Par exemple, s'il y a un grand nombre dans 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>
Dans PHP 5.3 ou plus tôt, ce nombre peut devenir un type flottant lors de l'appel JSON_DECODE , et la précision sera perdue. PHP 5.4 présente la constante JSON_BIGINT_AS_STRING . Lorsque vous spécifiez cette constante, JSON_DECODE traitera de grands entiers sous forme de chaînes au lieu de les convertir en types flottants. Cela évite le problème de la perte de précision.
Par exemple:
<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">// Sortir "12345678901234567890"</span></span><span>
</span></span>
Cette méthode convient particulièrement aux applications qui doivent faire face aux finances, à l'informatique scientifique et à d'autres domaines, et il peut garantir que la précision des valeurs numériques n'est pas affectée.
Bien que la constante JSON_PRETTY_PRINT ait existé dès PHP 5.3, son comportement sur la fonction JSON_DECODE a changé. Dans PHP 5.4, JSON_PRETTY_PRINT affecte principalement le format de sortie de la fonction JSON_ENCOCOD et n'affecte plus JSON_DECODE . Cependant, il est toujours important de comprendre le rôle de cette constante, car il aide les développeurs à lire et à comprendre la structure des données JSON plus facilement lors du débogage.
Par exemple, JSON_ENCODE est utilisé en conjonction avec 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>
Résultat de sortie:
<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>
Bien que JSON_DECODE lui-même ne formate pas les chaînes JSON, les développeurs peuvent l'utiliser lorsqu'ils font json_encode pour s'assurer que la sortie est plus conviviale et lisible.
PHP 5.4 améliore également la capacité d'analyse récursive de JSON_DECODE . Maintenant, si la chaîne JSON contient des tableaux ou des objets imbriqués, JSON_DECODE gérera ces structures récursives plus intelligemment, garantissant que les données JSON plus complexes peuvent être analysées correctement. Par exemple:
<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>
Sortir:
<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>
Cette amélioration permet aux développeurs d'éviter de s'inquiéter de la complexité des structures imbriquées, et les données JSON peuvent être directement converties en tableaux ou objets multidimensionnels.
La fonction JSON_DECODE dans PHP 5.4 améliore la prise en charge du codage UTF-8 lors du traitement des chaînes JSON contenant des caractères non ASCII. Bien que JSON_DECODE prenne également en charge le codage UTF-8 dans PHP 5.3 et plus tôt, PHP 5.4 en a fait une vérification plus stricte pour garantir que les données d'entrée sont un codage UTF-8 valide, sinon NULL sera renvoyé.
Par exemple:
<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">// Sortir "José"</span></span><span>
</span></span>
Cette amélioration garantit que les développeurs ne connaissent pas des erreurs d'analyse inattendues ou des problèmes d'encodage lors du traitement des données JSON contenant des caractères spéciaux.
PHP 5.4 a fait certaines optimisations dans la gestion des erreurs des fonctions JSON_DECODE . Lorsque l'analyse JSON_DECODE échoue, Null est renvoyé. Mais pour obtenir des informations d'erreur plus détaillées, vous pouvez utiliser la fonction JSON_LAST_ERROR () . Avant PHP 5.4, le message d'erreur était relativement simple et il peut être difficile pour les développeurs de déterminer la cause spécifique de l'erreur. Désormais, PHP 5.4 fournit plus de codes d'erreur, ce qui peut aider les développeurs à localiser plus précisément les problèmes.
Par exemple:
<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">// Faux JSON Format</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 Erreur de décodage: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">json_last_error_msg</span></span><span>(); </span><span><span class="hljs-comment">// Sortir详细的错误信息</span></span><span>
}
</span></span>
De cette façon, les développeurs peuvent facilement identifier et résoudre les problèmes de format des données JSON.