PHPでJSON文字列を連想配列に変換する

こんにちは、さるまりんです。

PHPでJSON文字列を連想配列に変換するにはjson_decode()関数を使います。

こんな感じです。

j2m.php

<?php
$jsonString = '{"name": "さるまりん", "height": 171, "city": "港区"}';

// JSON文字列を連想配列に変換
$array = json_decode($jsonString, true);

// 結果を表示
print_r($array);
?>

出力はこうなります。

$ php j2m.php 
Array
(
    [name] => さるまりん
    [height] => 171
    [city] => 港区
)

JSONから連想配列に変換する際にいくつか注意すべきポイントがありますので挙げておきます。

1. json_decode()の第二引数のtrueを省略するとオブジェクトが返されます

json_decode()関数の二つ目の引数にtrueを渡しているのは結果を連想配列で取得するためです。これがfalseだとオブジェクトが返ります。デフォルトはfalseなので二つ目の引数を省略するとオブジェクトになってしまうので注意が必要です。

以下はオブジェクトを返す例です。

$jsonString = '{"name": "さるまりん", "height": 171, "city": "港区"}';

$object = json_decode($jsonString); // オブジェクトが返される

返却されたのが連想配列を期待して$object['name']などとするとうまく動きません。

2. JSON文字列の構文エラー

JSONが不完全、構文エラーがある等、json_decode()が文字列を処理できない時はnullを返却します。

さっきのプログラムを変更してみました。

// 最後の}がない不完全な文字列
$jsonString = '{"name": "さるまりん", "height": 171, "city": "港区"';

// JSON文字列を連想配列に変換
$array = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'JSONエラー: ' . json_last_error_msg();
}

エラーが発生したかどうかはjson_last_error()でそのエラーのメッセージはjson_last_error_msg()で取得することができます。

実行するとこんなふうに表示されます。

$ php j2m.php
JSONエラー: Syntax error

3. UTF-8エンコーディング

json_decode()関数はUTF-8エンコーディングされたJSON文字列を処理することを前提にしています。なので他のエンコーディングの文字列がある場合は変換前にUTF-8にしてあげる必要があります。

こんな感じです。

$jsonString = utf8_encode($nonUtf8String);
$array = json_decode($jsonString, true);

4. 他にも

とても大きな数値や精度がとても重要な数値を扱う場合はPHPの浮動小数点の演算に依存するので精度の問題が起こることがあります。深いネストや大きなデータを知りしようとする場合はPHPのメモリの限界や最大ネストのレベルに注意する必要もあります。
また、配列をJSONにエンコードする際はjson_encode()を使用するのですが、特殊文字やマルチバイト文字が含まれている場合は文字列が正しくエンコードされないこともあります。これについても注意が必要です。

この変換はこれまでもいろんな場面でやっていると思います。
JSONと連想配列・マップはプログラムの中でとてもよく使うので今回改めてやってみました。

わかりやすく安全で効率の良いプログラムを書けるよう頑張ります。

読んでくださってありがとうございました。
それではまた!