json_decode関数の基本形式は次のとおりです。
$data = json_decode($jsonString, true);
最初のパラメーターはJSON文字列です。
2番目のパラメーターがtrueの場合、結果は連想配列に解析されます。省略またはfalseの場合、オブジェクトは返されます。
次の多次元JSONデータがあるとします。
{
"user": {
"name": "Alice",
"contacts": [
{"type": "email", "value": "[email protected]"},
{"type": "phone", "value": "123456789"}
]
}
}
解析コード:
$json = '{"user":{"name":"Alice","contacts":[{"type":"email","value":"[email protected]"},{"type":"phone","value":"123456789"}]}}';
$data = json_decode($json, true);
この時点で、 $データは多次元連想配列です。多くの開発者が遭遇した問題は次のとおりです。
JSONの解析が成功したかどうかを正しく判断しません<br> 着信JSONの形式が正しくない場合、 json_decodeはnullを返し、エラーを報告しません。 json_last_error()を使用して判断する必要があります。
難読化されたオブジェクトおよび配列アクセス方法<br> json_decodeの2番目のパラメーターがfalse (デフォルト)の場合、オブジェクトが返され、 - >アクセス属性が必要です。 trueの場合、配列が返され、 []アクセスが必要です。
多次元配列の階層的アクセスは<br>とは見なされません $ data ['user'] - > name $ data ['user']はオブジェクトではなく配列であるため、多次元配列にアクセスするときの名前はエラーを引き起こします。
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解析エラー:" . json_last_error_msg();
exit;
}
このステップは、後続の処理エラーを効果的に回避できます。
// エラーデモンストレーション(2番目のパラメーターはですtrue,結果は配列です,____は機能しません ->)
echo $data['user']->name; // エラーが報告されます
// 正しいデモンストレーション
echo $data['user']['name']; // 出力 Alice
連絡先を繰り返したいとします。
foreach ($data['user']['contacts'] as $contact) {
echo $contact['type'] . ": " . $contact['value'] . "\n";
}
複雑な構造と固定されていない層を持つJSONの場合、再帰的な解析が必要になる場合があります。例:
function printJson($data, $indent = 0) {
if (is_array($data)) {
foreach ($data as $key => $value) {
echo str_repeat(" ", $indent) . $key . ": ";
if (is_array($value)) {
echo "\n";
printJson($value, $indent + 1);
} else {
echo $value . "\n";
}
}
}
}
printJson($data);
このコードは、多次元配列のすべてのレベルと重要な値を明確に印刷します。
JSON_DECODEを使用して多次元JSONを解析するときは、解析が成功しているかどうかを確認し、 json_last_error()を使用してください。
渡された2番目のパラメーターを明確に定義し、オブジェクトと配列を返すかどうかを決定すると、アクセス方法が一貫している必要があります。
多次元配列またはオブジェクトの場合、アクセスレベルを正確にアクセスし、ミキシング- >と[]を回避します。
再帰関数を使用して、必要に応じて複雑な多次元構造を処理します。
上記のポイントをマスターする限り、多次元JSONデータを解析するときにJSON_DECODEの一般的なトラップを効果的に回避し、より堅牢で保守可能なPHPコードを記述できます。