PHPでは、 json_decode関数は通常、標準形式に準拠してPHPデータ型に変換するJSON文字列を解析するために使用されます。標準のJSON文字列には、キー名が二重引用符( "" )に囲まれ、文字列値は有効なユニコード文字などである必要があります。ただし、実際の開発では、非標準形式でJSON文字列に遭遇する可能性があり、これらの文字列を効果的に解析する方法が課題になります。この記事では、 json_decode関数を使用して標準以外の形式でJSON文字列を処理し、いくつかの実用的なヒントを共有する方法について説明します。
標準のJSON文字列は、キー名と文字列値をラップするには二重引用符( "" )が必要ですが、キー名または文字列値が単一の引用符( '' )を使用する状況に遭遇する場合があります。 PHPのJSON_DECODEは単一の引用符を直接サポートしていませんが、単純な交換で標準の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">$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>
この例では、 str_replace関数を使用して、すべての単一の引用符を二重引用符に置き換えて、 json_decodeが文字列をスムーズに解析できるようにします。
時々、閉じたブラケットやコンマが欠落しているなど、不完全なJSONストリングに遭遇する場合があります。この種の状況により、 json_decodeがnullを返します。これを処理するために、正規表現または単純な文字列操作を使用して、これらの不完全な部品を最初に完了することができます。
<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">// 閉じたブレースがありません</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">// 修理 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">$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>
このアプローチを使用すると、各JSON文字列を手動で確認し、解析の精度を確保することができます。
いくつかの非標準のJSON文字列では、配列またはオブジェクトの要素の後に追加のコンマ( 、 )がある場合があります。この状況は標準のJSONでは違法ですが、 JSON_DECODEを正しく解析できるように、単純な文字列交換を介して余分なコンマを削除できます。
<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">// 余分なコンマ</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">// 尾で余分なコンマを取り除きます</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>
ここでは、 preg_replace関数を使用して、端に冗長なコンマを見つけて削除して、JSON形式に準拠させます。
JSON文字列に漢字や非ASCII文字などの特殊文字が含まれている場合、 json_decode関数は、文字をエンコードする問題のために解析できない場合があります。このタイプの問題は、JSON文字列がUTF-8エンコードであることを確認することで回避でき、解析時に正しい文字セットが使用されます。
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"中国語", "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>
この例では、 json_unescaped_unicodeオプションを使用すると、 json_decodeの解析中にUnicode文字を脱出しないようにし、元の文字をエンコードします。
時々、冗長キーや不要なフィールドを含む場合がある予想構造に適合しないJSON文字列に遭遇することがあります。 2番目のパラメーターをtrueに渡すことにより、JSON文字列は連想配列に解析できます。これにより、不要なフィールドを簡単にスキップして有用なデータを保存できます。
<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">// 連想配列として解決します</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">// 不要なフィールドを削除します</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>
このコードは、JSON文字列内の特定のフィールドを無視し、必要なデータのみを保持する方法を示しています。
解析中にエラーが発生した場合、 json_decodeはnullを返します。コードの堅牢性を向上させるには、通常、解析の前または後にエラーが発生したかどうかを確認する必要があります。 PHPはjson_last_error()およびjson_last_error_msg()関数を提供して、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 デコードエラー: "</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>
このようにして、JSONの解析のエラーを正確にキャプチャし、それに応じて処理できます。
標準以外の形式でJSON文字列を扱う場合、 JSON_DECODE関数自体は強力な柔軟性を提供し、ほとんどの問題は通常、いくつかの文字列処理手法で解決できます。重要なのは、問題を正確に特定し、適切な処理方法を採用することです。この記事で共有されているいくつかのヒントを使用して、JSONデータをより効率的に処理し、コードの堅牢性と安定性を改善できます。