En PHP, la fonction JSON_DECODE est généralement utilisée pour analyser les chaînes JSON conformes aux formats standard et les convertir en types de données PHP. Les chaînes JSON standard exigent que le nom de clé soit entouré de citations doubles ( "" ), la valeur de la chaîne doit être des caractères Unicode valides, etc. Cependant, dans le développement réel, nous pouvons rencontrer des chaînes JSON dans des formats non standard, et comment analyser efficacement ces chaînes devient un défi. Cet article explorera comment utiliser la fonction JSON_DECODE pour gérer les chaînes JSON dans des formats non standard et partager quelques conseils pratiques.
Les chaînes JSON standard nécessitent des devis doubles ( "" ) pour envelopper les noms de clés et les valeurs de chaîne, mais parfois nous rencontrons des situations où les noms de clés ou les valeurs de chaîne utilisent des citations uniques ( '' ). JSON_DECODE de PHP ne prend pas directement en charge les devis uniques, mais nous pouvons le convertir au format JSON standard avec quelques remplacements simples.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">"{'name':'John', 'age':30}"</span></span><span>;
</span><span><span class="hljs-variable">$correctedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>([</span><span><span class="hljs-string">"'"</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], [</span><span><span class="hljs-string">'"'</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], </span><span><span class="hljs-variable">$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">$correctedJson</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>
Dans cet exemple, nous utilisons la fonction STR_REPLACE pour remplacer toutes les citations simples par des citations doubles afin que JSON_DECODE puisse analyser la chaîne en douceur.
Parfois, nous pouvons rencontrer des cordes JSON incomplètes, telles que des supports fermés manquants ou des virgules. Ce type de situation amènera JSON_decode à retourner null . Pour gérer cela, nous pouvons d'abord compléter ces pièces incomplètes en utilisant des expressions régulières ou des opérations de chaîne simples.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30'</span></span><span>; </span><span><span class="hljs-comment">// Orceaux fermés manquants</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rtrim</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-string">','</span></span><span>) . </span><span><span class="hljs-string">'}'</span></span><span>; </span><span><span class="hljs-comment">// réparation JSON Chaîne</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">$fixedJson</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>
Avec cette approche, nous pouvons éviter de vérifier manuellement chaque chaîne JSON et d'assurer la précision de l'analyse.
Dans certaines chaînes JSON non standard, il peut y avoir une virgule supplémentaire ( , ) après un élément dans un tableau ou un objet. Bien que cette situation soit illégale en JSON standard, nous pouvons supprimer les virgules excédentaires via un remplacement de chaîne simple pour nous assurer que JSON_DECODE peut être analysé correctement.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30,}'</span></span><span>; </span><span><span class="hljs-comment">// Une virgule supplémentaire</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/,\s*([}\]])/'</span></span><span>, </span><span><span class="hljs-string">'$1'</span></span><span>, </span><span><span class="hljs-variable">$json</span></span><span>); </span><span><span class="hljs-comment">// Retirez les virgules excédentaires à la queue</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">$fixedJson</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>
Ici, la fonction preg_replace est utilisée pour trouver et supprimer les virgules redondantes à la fin pour la rendre conforme au format JSON.
Si la chaîne JSON contient des caractères spéciaux, tels que des caractères chinois ou des caractères non ASCII, la fonction JSON_DECODE peut ne pas analyser en raison de problèmes de codage des caractères. Ce type de problème peut être évité en s'assurant que la chaîne JSON est un codage UTF-8 et que le jeu de caractères correct est utilisé lors de l'analyse.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"Chinois", "age":30}'</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_UNESCAPED_UNICODE);
</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>
Dans cet exemple, l'option JSON_UNESCAPED_UNICODE permet aux caractères Unicode de ne pas être échappés lors de l'analyse JSON_DECODE et conserve le codage des caractères d'origine.
Parfois, nous rencontrons des cordes JSON qui ne sont pas conformes à la structure attendue, qui peut contenir des clés redondantes ou des champs indésirables. En passant le deuxième paramètre True , la chaîne JSON peut être analysée dans un tableau associatif, ce qui facilite la sauvegarde des champs indésirables et préserver les données utiles.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30, "extraField":"value"}'</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-comment">// Résoudre en tant que tableau associatif</span></span><span>
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'extraField'</span></span><span>]); </span><span><span class="hljs-comment">// Supprimer les champs indésirables</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>
Ce code montre comment ignorer certains champs dans une chaîne JSON et conserver uniquement les données requises.
Si une erreur se produit pendant l'analyse, JSON_DECODE retournera NULL . Pour améliorer la robustesse du code, nous devons généralement vérifier si une erreur s'est produite avant ou après l'analyse. PHP fournit JSON_LAST_ERROR () et JSON_LAST_ERROR_MSG () pour obtenir des informations d'erreur pour l'analyse JSON.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30}'</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">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">json_last_error</span></span><span>() !== JSON_ERROR_NONE) {
</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-keyword">else</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>
De cette façon, nous pouvons capturer avec précision les erreurs en analyse JSON et les traiter en conséquence.
Lorsque vous traitez avec des chaînes JSON dans des formats non standard, la fonction JSON_DECODE elle-même offre une forte flexibilité, et la plupart des problèmes peuvent généralement être résolus grâce à certaines techniques de traitement de chaîne. La clé est d'identifier avec précision le problème et d'adopter des méthodes de manutention appropriées. Grâce à plusieurs conseils partagés dans cet article, vous pouvez traiter plus efficacement les données JSON et améliorer la robustesse et la stabilité de votre code.