PHPの配列をJSONデータとして出力する方法とJSONを読み込み配列にする方法

今回はPHPで配列をJSONに変換して出力したり、JSONデータを読み込んで配列にする方法です。

JSONというのは、JavaScript Object Notationの略で、テキストのデータです。

といっても最近ではJavaScriptのためのデータではなく、PHPなどでも幅広く使われています。

JSONという形式はXMLに似ててXMLを簡易的にした感じです。(だと僕は思ってます。)

XMLはタグ(キー)と値の組み合わせで、PHPで言う連想配列の作りに当てはまります。

 

配列をCSVに出力する方法だと連想配列のキーが無くなってしまいます。

配列をDBやファイルに出力して保持したい場合に、キーも保持したいならJSONがいいですね。

目次

PHPの連想配列をJSONデータに変換する方法

PHPの配列をJOSN形式のデータに変換するには json_encode() を使います。

[aside type=”normal”]json_encode($配列, $オプション)[/aside]

$配列は、JSONに出力するデータです。連想配列も多次元配列も対応します。

$オプションは、出力形式などを指定できます。

戻り値は、JSON形式に変換されたデータが取得できます。

詳細はphp.net参照

 

実際にJSON形式に変換してみましょう。

$ary = array(
	array('A', 23, '北海道,青森', '我輩は"猫"である。'),
	array('B', 23, '沖縄', "我輩は'猫'である。"),
	array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);

$json = json_encode($ary);
var_dump($json);

これを実行すると、以下のように出力されます。

string(286) "[["A",23,"\u5317\u6d77\u9053,\u9752\u68ee","\u6211\u8f29\u306f\"\u732b\"\u3067\u3042\u308b\u3002"],["B",23,"\u6c96\u7e04","\u6211\u8f29\u306f'\u732b'\u3067\u3042\u308b\u3002"],{"name":"C","age":23,"from":"\u6771\u4eac,\u57fc\u7389,\u5343\u8449","word":"\u307c\u3063\u3061\u3083\u3093"}]"

ぱっと見分かりにくいですが、日本語部分はユニコードに変換されてしまいます。

これでも問題無く、再度読み込んだときには見て読める日本語になります。

 

気になる方は、json_encodeの第2引数のオプションに JSON_UNESCAPED_UNICODE を指定すると日本語になります。

$ary = array(
	array('A', 23, '北海道,青森', '我輩は"猫"である。'),
	array('B', 23, '沖縄', "我輩は'猫'である。"),
	array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary, JSON_UNESCAPED_UNICODE);
var_dump($json);

//出力結果
//string(184) "[["A",23,"北海道,青森","我輩は\"猫\"である。"],["B",23,"沖縄","我輩は'猫'である。"],{"name":"C","age":23,"from":"東京,埼玉,千葉","word":"ぼっちゃん"}]"

日本語で表示され見やすくなりました。

ダブルクォーテーションや文字列内のカンマなども正しく変換してくれています。

 

一応補足ですが、出力結果は通常は1行で出力されます。

これを階層構造で出力するためには JSON_PRETTY_PRINT もオプションに指定してやります。

日本語のオプションも同時に指定したい場合は | を区切りにして複数指定することができます。

$ary = array(
	array('A', 23, '北海道,青森', '我輩は"猫"である。'),
	array('B', 23, '沖縄', "我輩は'猫'である。"),
	array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);

$json = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
var_dump($json);

// 出力結果
string(327) "[
    [
        "A",
        23,
        "北海道,青森",
        "我輩は\"猫\"である。"
    ],
    [
        "B",
        23,
        "沖縄",
        "我輩は'猫'である。"
    ],
    {
        "name": "C",
        "age": 23,
        "from": "東京,埼玉,千葉",
        "word": "ぼっちゃん"
    }
]"

次はこれを読み込んで元の連想配列を作成します。

JSONを読み込み連想配列にする方法

JSONデータを読み込み配列にするには、json_decode() を使います。

[aside type=”normal”]$配列 = json_decode($JSONデータ, true)[/aside]

$JSONデータは、配列に変換する元のJSONデータです。

第2引数の true は、連想配列で返す場合に指定します。この指定が無いと、キーを持つデータはオブジェクトに変換されます。

戻り値の$配列は、変換後の配列です。

詳細はphp.net参照

実際に動かしてみます。

JSONはテキストデータなので文字列で定義することができます。

今回は配列をJSONに変換し、そのJSONを再度配列に変換する流れで行います。

$ary = array(
	array('A', 23, '北海道,青森', '我輩は"猫"である。'),
	array('B', 23, '沖縄', "我輩は'猫'である。"),
	array('name' => 'C', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
$json = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);

$ary2 = json_decode($json, true);
var_dump($ary2);

実行結果は次のようになります。

array(3) {
  [0]=>
  array(4) {
    [0]=>
    string(1) "A"
    [1]=>
    int(23)
    [2]=>
    string(16) "北海道,青森"
    [3]=>
    string(26) "我輩は"猫"である。"
  }
  [1]=>
  array(4) {
    [0]=>
    string(1) "B"
    [1]=>
    int(23)
    [2]=>
    string(6) "沖縄"
    [3]=>
    string(26) "我輩は'猫'である。"
  }
  [2]=>
  array(4) {
    ["name"]=>
    string(1) "C"
    ["age"]=>
    int(23)
    ["from"]=>
    string(20) "東京,埼玉,千葉"
    ["word"]=>
    string(15) "ぼっちゃん"
  }
}

ちゃんと値の中にカンマやダブルクォーテーションがある場合も、1つの配列の要素として処理できています。

連想配列でキーを持っていたものは、キーもちゃんと復元されています。

まとめ

配列をJSONに変換するにはjson_encode()を使う。

JSONを配列に変換するにはjson_decode()を使う。

 

json_encode()は、見て分かる日本語にするには、第2引数のオプションに JSON_UNESCAPED_UNICODE を設定する。

出力時に整形させたい場合は JSON_PRETTY_PRINT をオプションに指定する。

 

json_decode() は第2引数に true を指定しないと、キーを持つ要素がオブジェクト形式になってしまう。

true を指定すれば連想配列になる。

この記事を書いた人

ライターのプロフィールが入ります。このライター情報を入れたくない場合は管理画面の ユーザー > あなたのプロフィールの「プロフィール情報」を未入力にすれば表示されません。逆に「プロフィール情報」を入力することでライター情報を表示できます。

コメント

コメントする

CAPTCHA


目次
閉じる